[1,2...,m] 模板的前缀Pi 的循环节为 clc = i-next[i]
i % clc == 0 && i != clc 则表示前缀中有 k = i / clc 个循环
完全是参考代码模板:
代码如下:
#include<iostream> #include<stdio.h> #include<string> #include<string.h> #define N 1000005 using namespace std; char P[N]; int m; int next[N]; void Prefix_Func() { int i,k; k=0; next[1]=0; for(i=2;i<=m;i++) { while(k>0 && P[k+1]!= P[i]) k=next[k]; if(P[k+1] == P[i]) k++; next[i]=k; } } int main() { int t=1,clc; while(scanf("%d",&m) && m) { scanf("%s",P+1); Prefix_Func(); cout<<"Test case #"<<t++<<endl; for(int i=2;i<=m;i++) { clc=i-next[i]; if(i%clc == 0 && i!=clc) cout<<i<<" "<<i/clc<<endl; } cout<<endl; } return 0 ; }
hdu 1358 kmp 求前缀有几个循环,布布扣,bubuko.com
原文:http://www.cnblogs.com/zn505119020/p/3571521.html