题目链接:
http://poj.org/problem?id=1961
题目大意:
给你一个字符串,让你求出到第i位之前的重复最多的有多少次。
比如aabaabaabaab,长度为12.到第二个b时,a出现2次,输出2.到第二个b之后那个a时,aab出现了2次,输出2.到第三个b时,aab出现3次,输出3.到第四个b之后时,aab出现4次,输出4.
解题思路:
求每一段的长度除了该段的最小循环节
代码如下:
#include <math.h>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <iostream>
#include <algorithm>
using namespace std;
int k = 0;
int ans = -1;
int srcLen = -1;
char src[1000000 + 8];
int kmpNext[1000000 + 8];
void init();
void kmp_per();
void KMP();
int main()
{
int T;
while (scanf("%d", &srcLen) != EOF&&srcLen)
{
init();
scanf("%s", src);
printf("Test case #%d\n", ++k);
KMP();
printf("\n");
}
return 0;
}
void init()
{
k = 0;
memset(kmpNext, 0, sizeof(kmpNext));
}
void kmp_per()
{
int i = 0;
int j = -1;
kmpNext[0] = -1;
while (i < srcLen)
{
while (-1 != j&&src[i + 1] != src[j + 1])
{
j = kmpNext[j];
}
if (src[i + 1] == src[j + 1])
{
j++;
}
i++;
kmpNext[i] = j;
}
}
void KMP()
{
kmp_per();
for (int i = 1; i <= srcLen; i++)
{
if (i % (i - kmpNext[i - 1] - 1) == 0 && kmpNext[i-1] != -1)
{
printf("%d %d\n", i, i / (i - kmpNext[i - 1] - 1));
}
}
}