您的位置:首页 > 其它

POJ-2406 Power Strings

2016-04-20 21:15 495 查看
题目链接:

http://poj.org/problem?id=2406

题目大意:

求该字符串的最多重复次数

解题思路:

总长度/最小循环节

代码如下:

#include <math.h>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <iostream>
#include <algorithm>
using namespace std;

int ans;
int srcLen;
char src[1000000 + 8];
int kmpNext[1000000 + 8];
void init();
void kmp_per();
void KMP();
int main()
{
memset(src, 0, sizeof(src));
while (scanf("%s", &src) != EOF&&src[0] != '.')
{
init();
KMP();
printf("%d\n", ans);
}
return 0;
}
void init()
{
ans = -1;
srcLen = strlen(src);
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();
ans = 0;
printf("%d %d\n", srcLen, (srcLen - kmpNext[srcLen - 1] - 1));
if (srcLen % (srcLen - kmpNext[srcLen - 1] - 1))
{
ans = 1;
}
else
{
ans = srcLen / (srcLen - kmpNext[srcLen - 1] - 1);
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  KMP