题目链接:      http://acm.hdu.edu.cn/showproblem.php?pid=3746

本来并不是看着一题的,搜代码时一不小心看到大牛说先看着题的找的规律,于是便拿来这题来看,于是惊叹发现曾经没思路的题,现在依然没思路,于是不理解的情况下,搜解释,终于搜到一句话:用KMP算法求最小循环节,这里有一个结论,最小循环节的大小为len-next[len]。于是便理解了好久,画了好几张纸,终于有所理解,于是自己按理解情况写了代码;还是有所反应的:

有个大牛代码,没看,但看了解释,对循环的解释,如果看怎么循环的,可以看一下,链接:http://www.cnblogs.com/Lyush/archive/2011/07/27/2118976.html

代码及注释如下:

View Code
#include<string.h>
#include<stdio.h>
int len;
char str[100001];
int next[100001];
void get_next()
{
int i,j;
j=-1;
next[0]=-1;
for(i=1;i<len;i++)
{
while(j>-1&&str[i]!=str[j+1])
j=next[j];
if(str[i]==str[j+1])
j++;
next[i]=j;
}
}
int main()
{
int t,n;
scanf("%d",&t);
getchar();
while(t--)
{
memset(next,0,sizeof(next));
gets(str);
len=strlen(str);
get_next();
n=len-(next[len-1]+1);////可以学着理解一下,其实最小循环节即为len-(next[len-1]+1);
if(len!=n&&len%n==0)///////////////len!=n就是字符长度不为1
printf("0\n");
else
printf("%d\n",n-len%n);////可以体会一下,应该是n-len%n;
}
return 0;
}

  

posted on 2011-08-18 11:29  world_ding  阅读(315)  评论(0编辑  收藏  举报