使得成为拥有2个循环节,为最少添加几个字母。
其实一样利用next数组性质。
#include"cstdio"
#include"cstring"
#include"cmath"
#include"cstdlib"
#include"iostream"
#include"algorithm"
using namespace std;
int next[200005],ans[200005];
void getnext(char *t)
{
int i,j;
i=0;j=-1;
next[0]=-1;
while(t[i])
{
if(j==-1||t[i]==t[j])
next[++i]=++j;
else
j=next[j];
}
}
int main()
{
int t;
scanf("%d",&t);
while(t--)
{
char a[200005];
int len;
scanf("%s",a);
getnext(a);
len=strlen(a);
if(len%(len-next[len])==0&&len/(len-next[len])>=2) printf("0\n");
else if(next[len]==0) printf("%d\n",len);
else printf("%d\n",(len-next[len])-len%(len-next[len]));
}
}