pku 2752 //kmp运用

/*
 题意:输出首尾串相同的前段位置 ,例abbcaabb,符合的:abb--abb,abbcaabb--abbcaabb,所以输出3,8
 思路:Kmp
         此题对于刚接触kmp的新手(比如说我),可以更深一点理解kmp思想
         我们先看看两个例子abbcaabb,输出的是3,8
                       ababcababababcabab,输出2,4,9,18
         其实可以看出一个规律,例一:next[8] = 3;  next[3] = 0;
                            例二:next[18] = 9; next[9] = 4; next[4] = 2; next[2] = 0;
         那么是不是只要把字符串长度(l)输出,然后递归输出next[l] (l = next[l]) 直到为0即可
         多组数据测试是这样的,为什么自己想想应该就能知道,我觉得kmp有时很灵活,自己想到的
         或许会理解的更透彻,实现见代码

*/

 

#include <stdio.h>

#include <string.h>

char s[400003];

int next[400003];

int a[400003];

int len;



void GetNext()

{

	int i,j;

	s[0] = '#';

	len = strlen(s);

	next[1] = 0;

	j=0;

	int temp = 0;

	for(i=2;i<=len;i++)

	{

		while(j>0 && s[j+1]!=s[i])

			j = next[j];

		if(s[j+1] == s[i]){

			j++;

		}

		next[i] = j;

	}

}



void Print()

{

	int temp = len - 1;

	int num = 0;

	a[num++] = len - 1;

	while(next[temp])

	{

		a[num++] = next[temp];

		temp = next[temp];

	}

	for(int i=num-1;i>0;i--) printf("%d ",a[i]);

	printf("%d\n",a[0]);

}



int main()

{

	int n;

	while(scanf("%s",s+1)!=EOF)

	{

		getchar();

		GetNext();

		Print();

	}

	return 0;

}

你可能感兴趣的:(KMP)