题目:
http://poj.org/problem?id=2752
题意:
求一个字符串所有前缀等于后缀的子串的长度。
思路:
KMP的next 数组的运用。
next数组记录的是 到当前位置与前缀相同的 前缀子串的位置。递归输出next数组,next = 0时输出,有值是递归。
AC.
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
const int maxn = 4e5+5;
char a[maxn];
int next[maxn], l;
void build_next()
{
next[1] = 0;
int j = 0;
for(int i = 2; i <= l; ++i) {
while(j > 0 && a[j+1] != a[i]) j = next[j];
if(a[j+1] == a[i]) j++;
next[i] = j;
}
}
void output(int x)
{
if(next[x] == 0) {
printf("%d", x);
return;
}
output(next[x]);
printf(" %d", x);
}
int main()
{
//freopen("in", "r", stdin);
while(~scanf("%s", a+1)) {
memset(next, 0, sizeof(next));
l = strlen(a+1);
build_next();
output(l);
printf("\n");
}
return 0;
}