POJ3461KMP模板
来源:互联网 发布:虚拟机的网络模式 编辑:程序博客网 时间:2024/06/08 13:17
模板水题,问子串t在母串s中出现的次数
注意:用cin读入会超时,要用scanf
/*pku3461(Oulipo), hdu1711(Number Sequence)这个模板 字符串是从0开始的Next数组是从1开始的*/#include <iostream>#include <cstring>#include <cstdio>using namespace std;const int N = 1000002;int next[N];char S[N], T[N];int slen, tlen;void getNext(){ int j, k; j = 0; k = -1; next[0] = -1; while(j < tlen) if(k == -1 || T[j] == T[k]) next[++j] = ++k; else k = next[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 = next[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 = next[j]; if(S[i] == T[j]) j++; if(j == tlen) { ans++; j = next[j]; } } return ans;}int main(){ int TT; int i, cc; scanf("%d",&TT); while(TT--) { scanf("%s%s",&T,&S); slen = strlen(S); tlen = strlen(T); cout<<KMP_Count()<<endl; } return 0;}/*test caseaaaaaa aabcd daabaa b*/
阅读全文
0 0
- POJ3461KMP模板
- poj3461KMP算法模板
- POJ3461KMP
- poj3461KMP匹配
- 模板
- 模板?
- 模板
- 模板
- 模板
- 模板
- 模板
- 模板
- 模板
- 模板
- 模板
- 模板
- 模板
- 模板
- error: ‘exit’ was not declared in this scope 的解决方法
- 进程信号课堂笔记
- keys
- 解决APP冷启动白屏/黑屏的问题
- 第三方支付接口开发及开发中遇到的坑爹问题
- POJ3461KMP模板
- java.lang.Exception: No tests found matching
- Java面试
- 第四周-项目二 建立单链表算法库
- 欢迎使用CSDN-markdown编辑器
- CodeForces864E【DP+路径输出】
- class的内容在jvm中的加载顺序
- Linux system 1
- 统计数字问题 算法实现 (补0递归法)