题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3746
比如abcabca
从1开始计数,计数到tlen:
nxt[i]表示以 i 结尾的最长公共前后缀的长度,不包括自身比如字符串a的nxt[0]为0,aa的nxt[1]为1。
nxt[i]同时表示前缀的最后一个位置(从1开始计数)
nxt[tlen]表示整个字符串的最长公共前后缀长度
len=tlen-nxt[tlen]表示最小循环节长度(不重叠)
nxt[tlen]%len表示未匹配字符数(最长公共后缀里面有可能不止一个循环节)
len-nxt[tlen]%len表示最少需要添加的字符构成循环节
#include<bits/stdc++.h>
using namespace std;
const int maxn=100000+10;
int slen,tlen,nxt[maxn],TT;
int maxx=-5,len;
char T[maxn];
void getNxt()
{
int i,j;
i=0,j=-1,nxt[0]=-1;
while(i<tlen)
{
if(j==-1||T[i]==T[j])
{
nxt[++i]=++j;
}
else
j=nxt[j];
}
}
int main()
{
scanf("%d",&TT);
while(TT--)
{
scanf("%s",T);
tlen=strlen(T);
getNxt();
maxx=nxt[tlen];
len=tlen-maxx;
if(nxt[tlen]==0)
{
cout << tlen << endl;
continue;
}
else if(tlen%len==0)
{
cout << 0 << endl;
continue;
}
else
{
int ans = len-(maxx%len);
cout << ans <<endl;
continue;
}
}
return 0;
}