题目:
链接:http://acm.hdu.edu.cn/showproblem.php?pid=3746
算法:
同上题3336,还是KMP算法中的next数组的活用。
思路:
利用next数组中的next[len](这个元素表示什么呢?举个例子就很清楚了。对于串“abca”,它的next[len]元素值是1,表示s[len-1]和s[0.....(len-2)]前缀相同的长度;若next[len]=k,那么表示s[len-1]及前面k-1个字符和s[0....k-1]相等)元素判断字符串的情况:已经是重复串或者不是。那应该怎样判断呢?设num=len-next[len](重复串的长度)我们不难发现:当len!=num&&len%num时,s[]本身就是重复串了,直接输出0就可以了;否则,就计算还需要的珍珠数目(num-next[len]%num)..............
代码:
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
int t;
char s[100010];
int len;
int next[100010];
void get_nextval(char s[],int len)
{
int i,j;
i=-1;
j=0;
next[0]=-1;
while (j<len)
{
if(i==-1 || s[i]==s[j])
{
j++; i++;
next[j]=i;
}
else
i=next[i];
}
}
int main()
{
//freopen("input.txt","r",stdin);
int num;
scanf("%d",&t);
getchar();
while(t--)
{
memset(next,0,sizeof(next));
gets(s);
len = strlen(s);
get_nextval(s,len);
num = len-next[len];
if(num != len && len%num==0)
printf("0\n");
else
printf("%d\n",num-next[len]%num);
}
return 0;
}