POJ 3461 kmp 应用
来源:互联网 发布:淘宝网运动服女装套装 编辑:程序博客网 时间:2024/05/29 16:28
题意:求匹配串在文本中出现次数,KMP应用,理解了就OK了,每次匹配成功就累加次数,开始的时候超时,
由于在处理每次成功的时候让i=i-len2+1,相当于回溯了,后来一想,本次成功,相当于“失败”,i不动,
由于在处理每次成功的时候让i=i-len2+1,相当于回溯了,后来一想,本次成功,相当于“失败”,i不动,
j需要用哪里来匹配?当然是next{j}!嘛(此处j=len2)。第一次真正敲kmp,完全根据自己理解敲出来的总控。
#include<iostream> //用string 220ms,char *,scanf 110ms#include<string>#include<cstdio>#include<cstring>using namespace std;int next[40000];void get_next(char * s) //next[len]也求得了(有意义)。{ int i=0,j=-1; next[0]=-1; int len=strlen(s); while(i<len) { if(j==-1||s[i]==s[j]) { i++;j++; if(s[i]==s[j]) //此处只为文本的匹配,可以加快! next[i]=next[j]; else next[i]=j; } else { j=next[j]; } }}int count=0;void kmp(char * tx,char * w){ int i=-1,j=-1; //为了下面++ int len2=strlen(w); int len1=strlen(tx); while(i<len1) { if(j==-1||tx[i]==w[j]) { i++;j++; } else { j=next[j]; } if(j==len2) //一次匹配成功, { count++; j=next[j]; //j对应位置。 } }}char tx[1000008];char w[10010];int main(){ int ta; cin>>ta; while(ta--) { count=0; scanf("%s\n",w); scanf("%s",tx); get_next(w); kmp(tx,w); printf("%d\n",count); } return 0;}
0 0
- POJ 3461 kmp 应用
- POJ 3461 Oulipo KMP大法应用
- poj 2406 KMP应用
- POJ 2406 kmp简单应用
- 【KMP模板】POJ 3461
- poj 3461 KMP
- poj 3461 Oulipo(KMP)
- kmp poj 3450 3461
- POJ 3461 KMP
- POJ 3461 kmp
- POJ 3461 Oulipo(KMP)
- poj 3461 kmp
- POJ 3461 Oulipo---kmp
- POJ 3461 Oulipo KMP
- poj 3461 Oulipo (KMP)
- POJ 3461 Oulipo ( KMP )
- POJ 3461 裸KMP
- 【POJ 3461 KMP】
- 如何判断文法是LL(1)SLR(1)LR(1)LALR(1)的?
- hdu2923 Einbahnstrasse
- 删除字符串中模式串
- Cocoa之NSDictionary总结
- UIScrollView 和 UIPageControl实现页面循环播放
- POJ 3461 kmp 应用
- 关于堆排序
- 中文字符集编码Unicode ,gb2312 , cp936 ,GBK,GB18030
- C语言数据类型转换详解
- 程序员的职业发展
- android自定义组合控件,参考Launcher中FolderIcon构成,欢迎拍砖。
- ubuntu jdk 安装和配置
- 虚拟机在线迁移研究报告
- IOS中NSUserDefaults的用法(轻量级本地数据存储)