1 条题解

  • 0
    @ 2025-10-8 17:05:33
    #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
    上传者