/*
这题考察对next数组的理解
next数组中的j本质上维护了从距离i最近的上一个重复串中与i对应的位置
因此如果i % (i - j) == 0 && i / (i - j ) > 1则这个刚好扫描到了重复的串
*/
#include <stdio.h>
#define MAX_N 1000000
char input[MAX_N + 3];
int next[MAX_N + 1];
int len;
void kmpNext(int len)
{
int i = 1, j = 0;
input[1] = getchar();
while(i <= len)
{
if(j == 0 || input[i] == input[j])
{
if(i % (i - j) == 0 && i / (i - j) > 1)
printf("%d %d/n", i, i / (i - j));
if(i == len)
break;
i++;
j++;
input[i] = getchar();
if(input[i] == input[j])
next[i] = next[j];
else
next[i] = j;
}
else
j = next[j];
}
}
int main()
{
int s = 0;
while(scanf("%d", &len) && len != 0)
{
getchar();
printf("Test case #%d/n", ++s);
kmpNext(len);
printf("/n");
}
return 0;
}

本文深入探讨了KMP算法中的next数组概念及其应用,通过具体的代码实现展示了如何利用next数组找到字符串中的重复子串,并附带了一个完整的C语言实现示例。
5万+

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



