KMP(SOJ2652)

来源:互联网 发布:山下智久石原里美 知乎 编辑:程序博客网 时间:2024/06/06 12:25
(2012-07-14 02:44:44)
SOJ2652:http://cstest.scu.edu.cn/soj/problem.action?id=2652
    过的第一道KMP题。

    这道题主要是解决输出所有子串的个数而不是像KMP算法里的仅仅输出第一个子串的位置。

代码:

#include<iostream>#include<cstring>using namespace std;int next[10005];char text[1000005];char pattern[10005];int main(){    int test;    scanf("%d",&test);    while(test--)    {        scanf("%s%s",pattern,text);        strcat(pattern,"0");        int lP=strlen(pattern);        ////////////////////////////        int j=0;        int k=-1;        next[0]=-1;        while(pattern[j])        {            if(k==-1 || pattern[j]==pattern[k])            {                ++j;                ++k;                if(pattern[j]!=pattern[k])                    next[j]=k;                else                    next[j]=next[k];            }            else                 k=next[k];        }        j=0;        int i=0;        int result=0;        while(text[i])        {            if(text[i]==pattern[j])            {                i++;                j++;            }            else if(next[j]==-1)            {                j=0;                i++;            }            else                j=next[j];            if(j==lP-1)            {                result++;                j=next[j];            }        }        printf("%d\n",result);    }    return 0;}

0 0
原创粉丝点击