自己写的KMP板子
来源:互联网 发布:vscode 新建工程 编辑:程序博客网 时间:2024/04/29 05:36
//获取匹配个数#include <bits/stdc++.h> using namespace std; const int maxn = 5005; int nt[maxn]; char a[maxn], b[maxn]; void GetNext(char b[], int blen) { int j = 0, k = -1; nt[0] = -1; --blen; while(j < blen) { if(k == -1 || b[j] == b[k]) { ++j; ++k; nt[j] = k; } else k = nt[k]; } } int KMP(char a[], char b[], int alen, int blen) { if(alen < blen) return 0; int ans = 0; if(blen == 1) { for(int i = 0; i < alen; ++i) { if(a[i] == b[0]) ++ans; } return ans; } int i = 0, j = 0; GetNext(b, blen); while(i < alen) { if(j == -1 || a[i] == b[j]) { ++i; ++j; } else j = nt[j]; if(j == blen) { ++ans; --i; j = nt[j-1]; } } return ans; } int main() { int alen, blen; cin >> a >> b; alen = strlen(a); blen = strlen(b); cout << KMP(a, b, alen, blen) << endl; return 0; }
//判断是否存在匹配#include <bits/stdc++.h> using namespace std; const int maxn = 5005; int nt[maxn]; char a[maxn], b[maxn]; void GetNext(char b[], int blen) { int j = 0, k = -1; nt[0] = -1; --blen; while(j < blen) { if(k == -1 || b[j] == b[k]) { ++j; ++k; if(b[j] == b[k]) nt[j] = nt[k]; else nt[j] = k; } else k = nt[k]; } } int KMP(char a[], char b[], int alen, int blen) {if(alen < blen) return 0; if(blen == 1) { for(int i = 0; i < alen; ++i) { if(a[i] == b[0]) return 1; } return 0; } int i = 0, j = 0; GetNext(b, blen); while(i < alen && j < blen) { if(j == -1 || a[i] == b[j]) { ++i; ++j; } else j = nt[j]; } if(j == blen) return 1; return 0;} int main() { int alen, blen; cin >> a >> b; alen = strlen(a); blen = strlen(b); if(KMP(a, b, alen, blen)) cout << "YES" << endl; else cout << "NO" << endl; return 0; }
//寻找首次出现位置#include <bits/stdc++.h> using namespace std; const int maxn = 5005; int nt[maxn]; char a[maxn], b[maxn]; void GetNext(char b[], int blen) { int j = 0, k = -1; nt[0] = -1; --blen; while(j < blen) { if(k == -1 || b[j] == b[k]) { ++j; ++k; if(b[j] == b[k]) nt[j] = nt[k]; else nt[j] = k; } else k = nt[k]; } } int KMP(char a[], char b[], int alen, int blen) {if(alen < blen) return -1; if(blen == 1) { for(int i = 0; i < alen; ++i) { if(a[i] == b[0]) return i; } return -1; } int i = 0, j = 0; GetNext(b, blen); while(i < alen && j < blen) { if(j == -1 || a[i] == b[j]) { ++i; ++j; } else j = nt[j]; } if(j == blen) return i-blen; return -1;} int main() { int alen, blen; cin >> a >> b; alen = strlen(a); blen = strlen(b); cout << KMP(a, b, alen, blen) << endl; return 0; }
//寻找所有匹配成功的在主串中的起点#include <bits/stdc++.h> using namespace std; const int maxn = 5005; int nt[maxn]; char a[maxn], b[maxn]; vector<int> vt;void GetNext(char b[], int blen) { int j = 0, k = -1; nt[0] = -1; --blen; while(j < blen) { if(k == -1 || b[j] == b[k]) { ++j; ++k; nt[j] = k; } else k = nt[k]; } } void KMP(char a[], char b[], int alen, int blen) { if(alen < blen) return; if(blen == 1) { for(int i = 0; i < alen; ++i) { if(a[i] == b[0]) vt.push_back(i); } return; } int i = 0, j = 0; GetNext(b, blen); while(i < alen) { if(j == -1 || a[i] == b[j]) { ++i; ++j; } else j = nt[j]; if(j == blen) { vt.push_back(i-blen); --i; j = nt[j-1]; } }} int main() { int alen, blen; cin >> a >> b; alen = strlen(a); blen = strlen(b); KMP(a, b, alen, blen); for(int i = 0; i < vt.size(); ++i) cout << vt[i] << " "; cout << endl; return 0; }
继续加油~
阅读全文
2 0
- 自己写的KMP板子
- KMP的板子题
- kmp板子
- KMP板子
- 拥有自己的ZigBee板子
- 定制自己的板子uboot
- 如何烧写v5t板子的kernel
- kmp板子及其拓展
- KMP板子题 HDU
- hdu_2087_两个kmp板子
- kmp板子 洛谷P3375
- 自己的KMP模板
- 自己理解的KMP
- 看到一篇博客写的kmp算法,由于才疏学浅,难以理解,干脆自己实现个kmp算法
- arm板子写spiflash
- 在自己的AT91RM9200板子上使用U-Boot
- arm板子启动时运行自己的QT程序
- 如何在自己的板子上实现android关机
- caffe常用层Convolution,SoftmaxLayer和SoftmaxLossLayer原理解析
- 基于qt的c++跨平台windows编程技术
- 实验六——MPEG音频编码
- コンピュターグラフィックス COMPUTER GRAPHICS[FOR CG ENGINEERS]-Appendix-a-0708
- 【二叉树】二叉树路径求和
- 自己写的KMP板子
- 多线程概念
- C++ 斐波拉契 河内塔
- 为RecyclerView添加吸顶条目分组(ItemDecoration)
- 机器学习
- Session 'TestApp': Error Installing APKs以及gradle building running问题
- iOS 多个不同宽度button布局自动换行
- 端口分类
- JavaScript——正则表达式大全