kmp算法的应用

来源:互联网 发布:淘宝联盟注册 编辑:程序博客网 时间:2024/05/21 18:41

题目:

http://poj.org/problem?id=2752


用KMP每次求得的next值就是当前到i为止的前子串与后字串相等的子串的长度,这也正是KMP的精髓所在,呵呵,通过这道题目才理解到的..!

#include<cstdio>#include<cstdlib>#include<cstring>char s[400001];int next[400001];int ans[400001];void solve(char *s,int ls){    int i=0,j=-1;    next[0]=-1;    while(i<ls)    {        if(j==-1||s[i]==s[j])        {            i++;            j++;            next[i]=j;        }        else        {           j=next[j];        }    }}int main(){    while(scanf("%s",s)!=EOF)    {        int i=0;        ans[0]=strlen(s);        solve(s,ans[0]);        while(ans[i++])        {          ans[i]=next[ans[i-1]];     //从长到短,递归查找前子串后子串相等的子串        }        for(int j=i-2;j>=0;j--)           printf("%d ",ans[j]);        printf("\n");    }    return 0;}