【JZOJ5272】【GDOI2018模拟8.14】神奇的重复序列

来源:互联网 发布:java安全等级设置 编辑:程序博客网 时间:2024/05/18 23:16

Description

这里写图片描述

Data Constraint

这里写图片描述

Solution

我们发现当两个起点i,j(i

Code

#include<iostream>#include<cmath>#include<cstring>#include<cstdio>#include<algorithm>using namespace std;const int maxn=3e3+5;int bz[maxn][200],f[maxn][maxn],mx[maxn];int n,m,i,t,j,k,l,x,y,z,num,sum,ans;char s[maxn];int pan(int i,int j,int l){    if (j-(i-l)>i) return 2*(i-l+1);return j-l+1;}int main(){    freopen("repeat.in","r",stdin);freopen("repeat.out","w",stdout);    scanf("%d\n",&m);    scanf("%s\n",s+1);n=strlen(s+1);    for (k=1;k<n;k++){        //memset(bz,0,sizeof(bz));memset(f,0,sizeof(f));memset(mx,0,sizeof(mx));        l=1;sum=0;        for (i=1;i<=n-k;i++){            j=i+k;t=j%k;            f[t][bz[t][s[j]]]--;            bz[t][s[j]]++;            f[t][bz[t][s[j]]]++;            if (mx[t]<bz[t][s[j]]) sum++,mx[t]++;            if (j-(i-l)>i){                f[t][bz[t][s[i]]]--;                bz[t][s[i]]++;                f[t][bz[t][s[i]]]++;                if (mx[t]<bz[t][s[i]]) sum=sum-mx[t]+(mx[t]=bz[t][s[i]]);            }            while (pan(i,j,l)-sum>m){                t=l%k;                f[t][bz[t][s[l]]]--;                if (mx[t]==bz[t][s[l]] && !f[t][mx[t]]) sum--,mx[t]--;                bz[t][s[l]]--;                f[t][bz[t][s[l]]]++;                if (j-(i-l)>i){                    x=j-(i-l);                    f[t][bz[t][s[x]]]--;                    if (mx[t]==bz[t][s[x]] && !f[t][mx[t]]) sum--,mx[t]--;                    bz[t][s[x]]--;                    f[t][bz[t][s[x]]]++;                }                l++;            }            if (ans<i-l+1) ans=i-l+1;        }        i=n-k;        while (l<=i){            t=l%k;            f[t][bz[t][s[l]]]--;            if (mx[t]==bz[t][s[l]] && !f[t][mx[t]]) sum--,mx[t]--;            bz[t][s[l]]--;            f[t][bz[t][s[l]]]++;            if (j-(i-l)>i){                x=j-(i-l);                f[t][bz[t][s[x]]]--;                if (mx[t]==bz[t][s[x]] && !f[t][mx[t]]) sum--,mx[t]--;                bz[t][s[x]]--;                f[t][bz[t][s[x]]]++;            }            l++;        }    }    printf("%d\n",ans);}
阅读全文
1 0
原创粉丝点击