1 条题解
-
0
#include<bits/stdc++.h> using namespace std; typedef unsigned long long ULL; const int N=2e5+10, P=5154133; int n, a[N], sta[N], top; ULL d[N], f[N], g[N]; ULL Hash(int l, int r){return f[r]-f[l-1]*d[r-l+1];} ULL Hash2(int l, int r){return g[r]-g[l-1]*d[r-l+1];} int main() { scanf("%d", &n); for(int i=1;i<=n;i++)scanf("%d", &a[i]); d[1]=P;for(int i=2;i<=n;i++)d[i]=d[i-1]*P; for(int i=1;i<=n;i++)f[i]=f[i-1]*P+a[i]; for(int i=1;i<=n;i++)g[i]=g[i-1]*P+a[n-i+1]; int ans=0;top=0; map<ULL, bool>v; for(int k=1;k*ans<=n;k++) { int t_ans=0;//t_ans为长度为k时不一样的个数 v.clear(); for(int j=k;j<=n;j+=k) { int L=j-k+1, R=j; if(t_ans+(n-R+k)/k<ans)break;//剪枝 ULL t=Hash(L, R)*d[k]*Hash2(n-R+1, n-L+1);//首位连接判断重复 if(v[t]==false)t_ans++; v[t]=true; } if(t_ans>ans){ans=t_ans;top=0;sta[++top]=k;} else if(t_ans==ans)sta[++top]=k; } printf("%d %d\n", ans, top); for(int i=1;i<top;i++)printf("%d ", sta[i]); printf("%d\n", sta[top]); return 0; }
- 1
信息
- ID
- 3746
- 时间
- 2000ms
- 内存
- 64MiB
- 难度
- 6
- 标签
- 递交数
- 60
- 已通过
- 20
- 上传者