题目大意:给定一个字符串,求最小循环节(可以不整除)
样例的Hint是错的无视掉就好 循环节应该是cab
这题利用了KMP中next数组的性质,也就是n-next[n]表示循环节
POJ的题都要求整除,这题不用整除,直接输出n-next[n]即可
注意next数组不要开成char~
#include<cstdio> #include<cstring> #include<iostream> #include<algorithm> #define M 1001001 using namespace std; int n,next[M]; char s[M]; void KMP() { int i,fix=0; for(i=2;s[i];i++) { while( fix && s[fix+1]!=s[i] ) fix=next[fix]; if( s[fix+1]==s[i] ) fix++; next[i]=fix; } } int main() { scanf("%d",&n); scanf("%s",s+1); KMP(); printf("%d\n",n-next[n]); }
BZOJ 1355 Baltic2009 Radio Transmission KMP算法
原文:http://blog.csdn.net/popoqqq/article/details/39929833