uva 1328 Period(KMP)

来源:互联网 发布:域名注册服务 编辑:程序博客网 时间:2024/06/06 15:36

题目链接:uva 1328 Period


题目大意:给出一个长度为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;}


2 1