使用MP算法(而非KMP),以及字符串關於邊界問題中出現的週期問題,詳見本博客的文章字符串匹配章節ios
#include <cstdio> #include <iostream> #include <algorithm> #include <cstring> using namespace std; const int maxn= 1e6+5; char ar[maxn]; int nxt[maxn]; void Kmp(int m) { int i= 0, j; j= nxt[0]= -1; while (i< m){ while (j> -1 && ar[i]!= ar[j]){ j= nxt[j]; } nxt[++i]= ++j; } } int main() { int kase=1, n, pd; while (EOF!= scanf("%d", &n) && n){ printf("Test case #%d\n", kase++); scanf(" %s", ar); Kmp(n); for (int i= 2; i<= n; ++i){ if (0== (i%(i-nxt[i]))){ pd= i/(i-nxt[i]); if (1!= pd){ printf("%d %d\n", i, pd); } } } putchar('\n'); } return 0; }