首页 > 代码库 > [KMP]HDU2087 剪花布条
[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 剪花布条
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。