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);
}