POJ-1961 字符串, Next数组的应用
给定一个字符串,求字符串的每个循环串的长度和循环节的大小
注意初始化Next
若 i 是 i - Next[i] 的倍数,表面这一段是循环串,循环节的长度是i - Next[i]。这是由于Next数组表示最长公共前后缀,若是倍数关系,表面前面的一段恰好是重复的。
char s2[maxn]; int len2; int Next[maxn]; void get_Next() { for (int i = 2, j = 0; i <= len2; i++) { while (s2[i] != s2[j + 1] && j > 0) j = Next[j]; if (s2[i] == s2[j + 1]) Next[i] = ++j; } } int main() { int n; int kase = 1; while (scanf("%d",&n)) { if (!n) break; memset(Next, 0, sizeof Next); scanf(" %s", s2 + 1); printf("Test case #%d\n", kase++); len2 = strlen(s2 + 1); get_Next(); for (int i = 1; i <= len2; i++) { //printf("%d\n", Next[i]); if ((i /(i - Next[i]) > 1) && i % (i - Next[i]) == 0) printf("%d %d\n", i, i / (i - Next[i])); } puts(""); } }