[KMP]HDU2087 剪花布条
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[KMP]HDU2087 剪花布条相关的知识,希望对你有一定的参考价值。
中文题目,没翻译。
思考
和上一道题目差不多,不过这道题目是字符串不能覆盖。那我们就可以这样想这些已经匹配的字符串,既然不能提供给后面帮助。那么我们可以直接把他们看做是剪去了,用之后剩下的这段母串和模式串再进行匹配。 所以当匹配成功时 ans++ 并将模式串指针清0
#include <iostream> #include <cstdio> #include <cstring> using namespace std; char t[1000005],p[10005]; int f[10005],ans; void getfail(char* p,int* f) { int m=strlen(p); f[0]=f[1]=0; for(int i=1;i<m;i++) { int j=f[i]; while(j&&p[j]!=p[i]) j=f[j]; f[i+1]=(p[i]==p[j])?j+1:0; } } void kmp(char* t,char* p,int* f) { int n=strlen(t),m=strlen(p); getfail(p,f); int j=0; for(int i=0;i<n;i++) { while(j&&p[j]!=t[i]) j=f[j]; if(p[j]==t[i]) j++; if(j==m) { ans++; j=0; } } } int main() { while(scanf("%s",p) && p[0] !=‘#‘) { scanf("%s",t); kmp(p,t,f); printf("%d\n",ans); ans=0; } return 0; }
以上是关于[KMP]HDU2087 剪花布条的主要内容,如果未能解决你的问题,请参考以下文章