poj 3461 Oulipo

来源:互联网 发布:证件照软件下载 编辑:程序博客网 时间:2024/05/16 09:46

kmp算法的简单应用,同上一个不同的是这里要统计个数,只需将kmp函数稍作修改就行了。


#include <cstdio>#include <cstring>using namespace std;int m,n;char w[10005],t[1000005];int next[10005];void get(){int j=0,k=-1;next[0]=-1;while(j<m){if(k==-1||w[j]==w[k]){next[++j]=++k;}elsek=next[k];}}int kmp(){int sum=0;int i=0,k=0;while(i<n&&k<m){if(k==-1||t[i]==w[k]){k++;i++;}else{k=next[k];}if(k==m)             //如果将这个判断放在循环的开始,循环的条件要改为i<=n&&k<=m  否则会漏解{//i=i-m+1;  //这里并不需要改变i的位置k=next[k];sum++;}}return sum;}int main(){    //freopen("in.txt","r",stdin);int g;scanf("%d",&g);while(g--){memset(next,0,sizeof(next));scanf("%s%s",w,t);        m=strlen(w);        n=strlen(t);get();int ans=kmp();printf("%d\n",ans);}}


0 0