【转】http://www.slyar.com/blog/poj-2406-c.html
#include <stdio.h>
#include <string.h>
#define MAX 1000001
int next[MAX];
char s[MAX];
int main()
{
int i, j, n, k, len;
while(1)
{
scanf("%s", s);
if (strcmp(s, ".") == 0) break;
len = strlen(s);
i = 0;
j = -1;
next[0] = -1;
while(i < len)
{
if (j == -1 || s[i] == s[j])
{
i++;
j++;
next[i] = j;
}
else
{
j = next[j];
}
}
/* 计算首尾重复子串的长度 */
j = i - next[i];
printf("%d %d %d\n", i, next[i], j);
/* 若串满足重复性质,则i%j==0;否则重复子串为本身 */
if (i % j == 0) k = i / j;
else k = 1;
printf("%d\n", k);
}
return 0;
}
本文提供了一段C语言代码,用于解决POJ 2406问题,该问题要求找出字符串的最长重复子串并计算其重复次数。通过KMP算法预处理next数组来高效地解决问题。
8255

被折叠的 条评论
为什么被折叠?



