题目大意:给出一个长度为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; }
hdu 1358 Period(KMP),布布扣,bubuko.com
原文:http://blog.csdn.net/keshuai19940722/article/details/21469381