标签:
当初学KMP的时候也做过这道题,现在看来还是刘汝佳的代码要精简一些,毕竟代码越短越好记,越不容易出错。
而且KMP的递推失配函数的代码风格和后面的Aho-Corasick自动机求失配函数的代码风格也是一致的。
1 #include <cstdio> 2 3 const int maxn = 1000000 + 10; 4 char s[maxn]; 5 int f[maxn]; //失配函数 6 7 int main() 8 { 9 //freopen("in.txt", "r", stdin); 10 11 int n, kase = 0; 12 while(scanf("%d", &n) == 1 && n) 13 { 14 getchar(); 15 for(int i = 0; i < n; i++) s[i] = getchar(); 16 17 //递推求解失配函数 18 f[0] = f[1] = 0; 19 for(int i = 1; i < n; i++) 20 { 21 int j = f[i]; 22 while(j && s[i] != s[j]) j = f[j]; 23 f[i+1] = s[i] == s[j] ? j+1 : 0; 24 } 25 26 printf("Test case #%d\n", ++kase); 27 for(int i = 2; i <= n; i++) 28 if(f[i] && i % (i - f[i]) == 0) 29 printf("%d %d\n", i, i / (i - f[i])); 30 printf("\n"); 31 } 32 33 return 0; 34 }
标签:
原文地址:http://www.cnblogs.com/AOQNRMGYXLMV/p/4390490.html