ACM模板——KMP算法
来源:互联网 发布:易语言在线更新源码 编辑:程序博客网 时间:2024/06/05 20:32
KMP
#include <string>#include <iostream>#include <cstring>using namespace std;void getfill(string s,int* f){ //memset(f,0,sizeof(f)); //根据其前一个字母得到 for(size_t i=1;i<s.size();i++) { int j=f[i]; while(j && s[i]!=s[j]) j=f[j]; f[i+1]=(s[i]==s[j])?j+1:0; }}int KMP(string a,string s){ int* f=new int[s.size()+32]; memset(f,0,sizeof(int)*s.size()); getfill(s,f);size_t j=0; for(size_t i=0;i<a.size();i++) { while(j && a[i]!=s[j]) j=f[j]; if(a[i]==s[j]) j++; if(j==s.size()){ delete[] f;return i-s.size()+1; } } delete[] f; return -1;}
KMP (int)
注: N为数组T的长度, M为数组P的长度. Next数组长度应稍大于P的长度
void MakeNext(int* P,int M,int* Next){ Next[0] = -1; int i = 0, j = -1; while(i<M){ if(j==-1||P[i]==P[j]){ i++,j++; if(P[i]!=P[j])Next[i] = j; else Next[i] = Next[j]; } else j = Next[j]; }}int KMP(int* T,int N,int* P,int M){ MakeNext(P,M,Next); int i=0,j=0; while(i<N&&j<M){ if(T[i]==P[j]||j==-1)i++,j++; else j = Next[j]; } if(j==M)return i-M; else return -2;}
1 0
- ACM模板——KMP算法
- ACM常用模板——扩展KMP
- ACM常用模板——字符串匹配——KMP
- 【KMP】KMP算法模板
- 邝斌的ACM模板(KMP算法)
- ACM模板——Floyd算法
- ACM模板——SPFA算法
- ACM学习历程26——KMP算法
- ACM #1015 KMP算法
- acm-kmp算法
- 数据结构—KMP模板
- kmp算法模板
- kmp算法模板
- KMP算法模板
- KMP算法模板
- KMP算法(模板)
- KMP算法模板
- KMP算法标准模板
- 初始设置mysql密码
- Light OJ 1116 - Ekka Dokka (简单数学)
- Ubuntu下如何安装VMWave虚拟机?
- hdu5831(2016多校第8场,简单模拟)
- 2099 整除的尾数
- ACM模板——KMP算法
- range check instead of index usage mysql索引使用注意
- CS231n A Few Useful Things to Know about Machine Learning
- Postgresql 2
- Android:onNewIntent()触发机制及注意事项
- 黑客的狂欢:他们如何在里约奥运会掘金
- 位运算及其应用实例
- ==与===之间的区别
- find_shape_mode参数详解及时长优化