POJ 3461 Oulipo KMP模板题

来源:互联网 发布:雅思听力技巧 知乎 编辑:程序博客网 时间:2024/05/20 05:29

传送门


题目大意:
第二个串中有多少个第一个串


分析:
裸KMP
在这里放一个代码
由于大家普遍字符串从0开始
而我是个有原则的人,从1开始……….>_<
所以
为了防止自己将来忘了怎么写不知道去哪里找代码
还是在这里放一段代码吧


代码如下:

#include<algorithm>#include<iostream>#include<cstring>#include<cstdio>using namespace std;const int maxn=1000000+5;int cas,lenp,lens,nxt[maxn];char p[maxn],s[maxn];inline void getnext(void){    int k;    nxt[0]=nxt[1]=0;    for(int i=1;i<lenp;i++){        k=nxt[i];        while(k&&p[k+1]!=p[i+1])            k=nxt[k];        if(p[k+1]==p[i+1])            nxt[i+1]=k+1;        else            nxt[i+1]=0;    }}inline void kmp(void){    int ans=0,posp=1,poss=1;    while(poss<=lens){        if(p[posp]==s[poss])            posp++,poss++;        else if(posp==1)            poss++;        else            posp=nxt[posp-1]+1;        if(posp==lenp+1)            ans++,posp=nxt[posp-1]+1;    }    cout<<ans<<endl;}signed main(void){    scanf("%d",&cas);    while(cas--){        scanf("%s%s",p+1,s+1);        lenp=strlen(p+1),lens=strlen(s+1);        for(int i=1;i<=lenp;i++)            nxt[i]=0;        getnext();        kmp();    }    return 0;}

by >o< neighthorn

1 0
原创粉丝点击