HDU 2087 剪花布条

来源:互联网 发布:mac系统 high sierra 编辑:程序博客网 时间:2024/05/18 17:45

剪花布条

题目连接:点击打开链接
题意:第二个串在第一个串出现的次数(不能重叠)
思路 :kmp,当匹配到的时候,往后跳第二个串的长度
#include<iostream>#include<cstring>#include<cstdio>using namespace std;char t[2000],p[2000];int sum;void makenext(char p[],int next[]){int m,i,k;m=strlen(p);next[0]=0;for(i=1,k=0;i<m;i++){while(k>0&&p[i]!=p[k]){k=next[k-1];}if(p[i]==p[k]){k++;}next[i]=k;}}void kmp(char t[],char p[],int next[]){int i,n,m,k;n=strlen(t);m=strlen(p);makenext(p,next);for(i=0,k=0;i<n;++i){while(k>0&&p[k]!=t[i]){k=next[k-1];}if(p[k]==t[i]){k++;}if(k==m){sum++;i=i+m-1;}}cout<<sum<<endl;}int main(){int next[10010]={0};memset(t,0,sizeof t);memset(p,0,sizeof p);while(~scanf("%s",&t)){ if(t[0]==35)break;scanf("%s",&p);sum=0;kmp(t,p,next);}}


0 0