Hdu-1358Period(KMP算法之next数组的应用)
题解:对于串pattern来说,如果0~i-1这个位置中循环,那么i%(i-next[i])==0 ,循环次数为 i/(i-next[i]),循环长度为 i-next[i]
例如对于串ababab来说
index 0 1 2 3 4 5
char a b a b a b
next -1 0 0 1 2 1
对于index=4时,i%(i-next[i])==0,而0~3位置的字符存循环。
代码:
#include<cstdio> #include<iostream> #include<cstring> int N,next[1000001]; char pattern[1000001];//用于存放模式串 void getNext()//求next数组的模板 { next[0]=-1; int k=-1,j=0; while(j<N){ if(k==-1||pattern[k]==pattern[j]){ ++j;++k; next[j]=k; } else k=next[k]; } }
void solve() {
//如果i%(i-next[i])==0 那么就有循环,循环次数为 i/(i-next[i]),循环长度为 i-next[i] int i,n; for(i=2;pattern[i-1];++i){ n=i-next[i];//这里我借鉴了一位大牛的博客,感谢大牛的博客 if(i%n==0 && i/n>1){ printf("%d %d\n",i,i/n); } } return;//记得得回溯 }
int main() { int cnt=0; while(~scanf("%d",&N),N){ getchar(); memset(next,0,sizeof(next)); gets(pattern); getNext(); printf("Test case #%d\n",++cnt); solve(); printf("\n"); } return 0; }
//关于solve()函数的详细解析请参考大牛的博客,http://www.cnblogs.com/jackge/archive/2013/01/05/2846006.html