传送门:http://acm.hdu.edu.cn/showproblem.php?pid=3746
【分析】:题目的意思是这这个串里,需要添加多少字符或者不添加,才可以让它里面的循环体成为至少两次的循环。这里需要巧妙用到next数组,并不需要去优化它,因为不优化的时候求的才是前后缀的最大相同字符个数。要有一个循环体的值minlong=strlen(str)-nex[strlen(str)]。不需要增加的情况,就是刚好两次以上的循环,要增加的话,要先计算出不满足循环体多出来的字符个数strlen(str)%minlong,然后让循环体的长度减去这字符个数,就是需要添加来补齐成为一个小循环体。
#include<iostream>
#include<string>
char str[100000+10];
int nex[100000+10];
void getnex(int len)
{
int i=-1,j=0;
nex[0]=-1;
while(j<len)
{
if(i==-1 || str[i]==str[j])
{
++j;
++i;
nex[j]=i;
}
else
i=nex[i];
}
}
int main()
{
int n;
scanf("%d",&n);
while(n--)
{
getchar();
scanf("%s",str);
int len=strlen(str);
getnex(len);
int minlong=len-nex[len];//得到这个小循环体的值
if(minlong!=len && len%minlong==0)
printf("0\n");
else
printf("%d\n",minlong-len%minlong);//添加来补齐成为一个小循环体
}
return 0;
}