poj 3461 Oulipo(简单的kmp入门)

来源:互联网 发布:淘宝售后率高 编辑:程序博客网 时间:2024/05/30 13:42

就是完完全全用kmp算法来写的一道题,每当找到一个与模式串匹配的计下次数,然后以next数组后退继续寻找下一个

代码在这:

#include <iostream>#include <cstdio>#include <cstring>using namespace std;const int N=1000010;char s[N];char p[N];int next[N];void fnext(){    int i,k;    int n=strlen(p);    next[0]=-1;    for(i=1,k=-1;i<n;++i)    {        while(k!=-1&&p[i]!=p[k+1]) k=next[k];        if(p[i]==p[k+1])            k++;        next[i]=k;    }}int kmp(){    int sum=0;    int n,m;    int i,j;    n=strlen(s);    m=strlen(p);    fnext();    for(i=0,j=-1;i<n;++i)    {        while(j!=-1&&s[i]!=p[j+1])            j=next[j];        if(s[i]==p[j+1])            j++;        if(!p[j+1]) {sum++;j=next[j];}    }    return sum;}int main(){    int n;    scanf("%d",&n);    while(n--)    {        scanf("%s%s",p,s);        int res=kmp();        printf("%d\n",res);    }    return 0;}


0 0
原创粉丝点击