Period POJ 1961
#include <iostream> #include <cstdio> #include <cstring> #define Memset(x, a) memset(x, a, sizeof(x)) using namespace std; const int N = 1e6 + 10; char s[N]; int Next[N]; int n; // 性质 :一个字符串中任意循环元的长度必然是最小循环元长度的倍数 void getNext(const char P[],int Next[]){ int m = strlen(P); // strlen记录有效数组元素个数 int i = 0, j; j = Next[0] = -1; while (i < m) { // 扫一遍 while (-1 != j && P[i] != P[j]) j = Next[j]; Next[++i] = ++j; } } int main(){ int kase = 0; // 用于输出的一个格式控制 while (cin >> n && n){ cin >> s; Memset(Next, 0); // 将Next这个数组清空 getNext(s, Next); // Next中存的应该是减去一个单位长度的值 用 i - Next[i]得到的是单位长度 cout << "Test case #" << ++kase << endl; for(int i = 2; i <= n; i++) { if(Next[i] > 0 && i % (i - Next[i]) == 0) // 用i除 i - Next[i]得到的是循环次数 } cout << endl; } return 0; }