题意:在一个字符串中添加几个字符,使这个字符串至少有一个循环节。
思路:网上好多代码都用的KMP。但是我看到这道题第一想法是扩展KMP。。就用exKMP写了一发,发现错了。后来看了看网上KMP的方法。发现KMP和扩展KMP在这道题里面都可以用。
代码如下:
#include<iostream>
#include<cstdio>
#include<cstring>
#include<queue>
using namespace std;
char a[100005];
int extend[100005];
void extKMP()
{
int i,j,k;
int m=strlen(a);
for(j=0;1+j<m&&a[j]==a[1+j];j++);
extend[1]=j;
extend[0]=m;
k=1;
for(i=2;i<m;++i){
int len=k+extend[k];
int l=extend[i-k];
if(l<len-i){
extend[i]=l;
} else {
for(j=max(0,len-i);i+j<m&&a[j]==a[i+j];j++);
extend[i]=j;
k=i;
}
}
}
int main()
{
// freopen("data.txt","r",stdin);
int T;
scanf("%d",&T);
while(T--){
scanf("%s",a);
extKMP();
int len=strlen(a);
int ans=len;
for(int i=1;i<len;++i){
if(i+extend[i]==len){
if(i!=0&&len%i==0){
ans=0;
} else {
ans=min(ans,i-extend[i]%i);
}
}
}
printf("%d\n",ans);
}
return 0;
}