POJ_2752
将字符串对自己进行KMP匹配即可,也即进行一般的KMP问题的预处理的步骤。之后去找恰好匹配到最后一个字符的所有可能的前缀的长度即可,也就是遍历一遍P[N],其中N为字符串的长度。
#include<stdio.h>
#include<string.h>
#define MAXD 400010
char b[MAXD];
int P[MAXD];
void printresult(int k)
{
if(P[k] == 0)
printf("%d", k);
else
{
printresult(P[k]);
printf(" %d", k);
}
}
void solve()
{
int i, j, k;
P[1] = j = 0;
for(i = 2; b[i]; i ++)
{
while(j > 0 && b[j + 1] != b[i])
j = P[j];
if(b[j + 1] == b[i])
++ j;
P[i] = j;
}
printresult(i - 1);
printf("\n");
}
int main()
{
while(scanf("%s", b + 1) == 1)
{
solve();
}
return 0;
}