题目大意:给出一个长度为n的字符串,要求找到一些i,满足说从1~i为两个的重复子串构成,并输出子串的个数。
解题思路:KMP,只是在求next数组的时候,对于每个位置的next[i]都进行判断,如果i%(i-next[i]) = 0,即为满足的位置。
#include <stdio.h>
#include <string.h>
const int N = 1e6+5;
int n, next[N];
char s[N];
void getNext () {
int p = 0;
for (int i = 2; i <= n; i++) {
while (p > 0 && s[p+1] != s[i])
p = next[p];
if (s[p+1] == s[i])
p++;
next[i] = p;
if (p) {
int k = i - next[i];
if (i%k == 0)
printf("%d %d\n", i, i/k);
}
}
}
int main () {
int cas = 1;
while (scanf("%d", &n) == 1 && n) {
scanf("%s", s+1);
printf("Test case #%d\n", cas++);
getNext();
printf("\n");
}
return 0;
}