标签:
3 aaa 12 aabaabaabaab 0
Test case #1 2 2 3 3 Test case #2 2 2 6 2 9 3 12 4
题意:求出所有前缀串中最小循环节长度小于自身的前缀,同时输出最小循环节
循环次数。
根据next数组,因为i-next[i]表示prefix[0...i-1]的最小循环节长度,所以直接遍历
判断即可。
#include <cstring>
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <vector>
#include <cmath>
using namespace std;
#define maxn 1111111
char T[maxn];
int n;
#define next Next
int next[maxn];
void get_next (char *p) {
int m = strlen (p);
int t;
t = next[0] = -1;
int j = 0;
while (j < m) {
if (t < 0 || p[j] == p[t]) {//匹配
j++, t++;
next[j] = t;
}
else //失配
t = next[t];
}
}
int main () {
int kase = 0;
while (scanf ("%d", &n) == 1 && n) {
scanf ("%s", T);
get_next (T);
printf ("Test case #%d\n", ++kase);
for (int i = 1; i <= n; i++) {
int j = next[i];
int len = i-j;
if (i%len == 0 && i/len > 1) {
printf ("%d %d\n", i, i/len);
}
}
printf ("\n");
}
return 0;
}标签:
原文地址:http://blog.csdn.net/morejarphone/article/details/51356746