HDU-3736(KMP_循环节)

来源:互联网 发布:凸轮机构设计软件 编辑:程序博客网 时间:2024/05/20 03:07

这道题目也是运用next值的一道题目,我发现,运用next[]的题目真的很多,,,

今天也是搞了一天的next函数了....懂是有些懂了,.,,但是猛地把自己的原来的编程习惯变了 还 是有点不适应的,,

但是确实两种理解方法都可以,,但是 还是现在用的这个getnext好用一些,,自己可以做出简单的证明,

而这道题目,就是让你求不能重复利用的最大循环节是多少,

可以利用最后一个的后一个next值算处理,,其实大家都知道next保留的值就是前面的最长字母序列数.

求出来循环节之后,剩下的就好说了.

大家看看代码,我也参考了我的一位学长的代码的

#include <stdio.h>#include <string.h>#include <stdlib.h>#include <math.h>char pat[100005];int next[100005];int len;int getnext(){int i=1,j=0;next[1]=0;while(i<=len){if(j==0||pat[i]==pat[j]){i++,j++;next[i]=j;}elsej=next[j];}return next[len+1];}int main(){int T;scanf("%d",&T);while(T--){scanf("%s",pat+1);pat[0]='#';len=strlen(pat)-1;int temp=getnext();//printf("%d\n",temp);int ans=len-(temp-1);//temp-1 是循环节printf(len>ans&&len%ans==0?"0\n":"%d\n",ans-len%ans);}return 0;}