【无聊放个模板系列】HDU 1358 KMP
1 #include<cstdio> 2 #include<cstdlib> 3 #include<cstring> 4 #include<iostream> 5 #include<algorithm> 6 #include<queue> 7 #include<cmath> 8 using namespace std; 9 #define Maxn 1000010 10 11 char s[Maxn]; 12 int a[Maxn],nt[Maxn]; 13 int l; 14 15 void kmp() 16 { 17 int p=0; 18 for(int i=2;i<=l;i++) 19 { 20 while(s[i]!=s[p+1]&&p) p=nt[p]; 21 if(s[i]==s[p+1]) p++; 22 nt[i]=p; 23 } 24 } 25 26 int main() 27 { 28 int kase=0; 29 while(1) 30 { 31 scanf("%d",&l); 32 if(l==0) break; 33 scanf("%s",s+1); 34 kmp(); 35 printf("Test case #%d\n",++kase); 36 // for(int i=2;i<=l;i++) printf("%d ",nt[i]);printf("\n"); 37 for(int i=2;i<=l;i++) 38 { 39 if(nt[i]!=0&&i%(i-nt[i])==0) printf("%d %d\n",i,i/(i-nt[i])); 40 }printf("\n"); 41 } 42 return 0; 43 }
KMP
2016-11-17 20:12:31