KMP模板
来源:互联网 发布:数据可视化实战 编辑:程序博客网 时间:2024/06/16 06:15
直接上代码:
/*pku3461(Oulipo), hdu1711(Number Sequence)这个模板 字符串是从0开始的Next数组是从1开始的*/#include <iostream>#include <cstring>using namespace std;const int N = 1000002;int nxt[N];char S[N], T[N];int slen, tlen;void getNext(){ int j, k; j = 0; k = -1; nxt[0] = -1; while(j < tlen) if(k == -1 || T[j] == T[k]) nxt[++j] = ++k; else k = nxt[k];}/*返回模式串T在主串S中首次出现的位置返回的位置是从0开始的。*/int KMP_Index(){ int i = 0, j = 0; getNext(); while(i < slen && j < tlen) { if(j == -1 || S[i] == T[j]) { i++; j++; } else j = nxt[j]; } if(j == tlen) return i - tlen; else return -1;}/*返回模式串在主串S中出现的次数*/int KMP_Count(){ int ans = 0; int i, j = 0; if(slen == 1 && tlen == 1) { if(S[0] == T[0]) return 1; else return 0; } getNext(); for(i = 0; i < slen; i++) { while(j > 0 && S[i] != T[j]) j = nxt[j]; if(S[i] == T[j]) j++; if(j == tlen) { ans++; j = nxt[j]; } } return ans;}int main(){ int TT; int i, cc; cin>>TT; while(TT--) { cin>>S>>T; slen = strlen(S); tlen = strlen(T); cout<<"模式串T在主串S中首次出现的位置是: "<<KMP_Index()<<endl; cout<<"模式串T在主串S中出现的次数为: "<<KMP_Count()<<endl; } return 0;}/*test caseaaaaaa aabcd daabaa b*/
还有一个B站的视频链接,讲得很好~~
http://www.bilibili.com/video/av3246487/
阅读全文
0 0
- KMP模板
- KMP 模板
- kmp模板
- kmp模板
- kmp模板
- KMP模板
- kmp模板
- kmp模板
- KMP 模板
- 【模板】KMP
- KMP模板
- KMP模板
- 【KMP 模板】
- KMP模板
- KMP 模板
- kmp模板
- KMP模板
- KMP 模板
- ubuntu 下7z 如何解压 .run 文件的安装 myeclipse 的破解
- 《Android源码设计模式解析与实战》读书笔记(十三)——备忘录模式
- SpringBoot中Redis的使用
- 单例模式
- centos7/etc/rc.local不开机自启
- KMP模板
- 英语课程实现在微信上预约
- 斐波那契数和GCD的关系定理
- opencv之模板匹配(初)
- 二叉树三种遍历方式代码实现
- Android开发之Android4.4的状态栏变色相关的东西
- Spring整合Redis作为缓存
- C++抽象编程——数组(2)——数组与指针
- C#:使用MVC和Mybatis(IBatis.Net)搭建项目(一)