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; }