POJ2752(KMP)

大意:给定一个字符串,求所有可能的既是前缀又是后缀的字串长度。

分析:按题目的意思很像求KMP中的next数组。next[len]是最大的前缀-后缀字符串长度,以此类推next[next[len]]同样为满足条件的前缀-后缀字符串长度。

代码

#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
char str[400005];
int len, next1[400005], ans[400005];
void getnext()
{
	int i = 0, j = -1;
	next1[0] = -1;
	while (i < len)
	{
		if (j == -1 || str[i] == str[j])
		{
			i++;
			j++;
			next1[i] = j;
		}
		else
			j = next1[j];
	}
}
int main()
{
	while (scanf("%s", str) != EOF)
	{
		len = strlen(str);
		getnext();
		ans[0] = len;
		int n = 0, i = len;
		while (next1[i] > 0)
		{
			ans[++n] = next1[i];
			i = next1[i];
		}
		for (i = n; i >= 0; i--)
			printf("%d ",ans[i]);
		printf("\n");
	}
	return 0;
}


posted @ 2016-05-08 23:36  Nickqiao  阅读(135)  评论(0编辑  收藏  举报