ACM模板——KMP算法
2016-08-13 11:51
337 查看
KMP
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;
}
#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;
}
相关文章推荐
- 邝斌的ACM模板(KMP算法)
- ACM_模板_KMP算法
- KMP算法模板及问题解决(HDU 1711)(hihocoder 1015 KMP)(HDU 1686)(POJ3461)(HDU1358)
- ACM模板 字符串
- ACM模板——SPFA算法
- ACM 快速幂模板 HDU4365
- 【ACM模板】——hello_chengdongni 随着姿势提升,不定期补充
- 2017年ACM模板(常用)弱渣整理 二、二分
- [ACM模板]ZKW MCMF费用流
- [ACM模板]输入输出加速
- 邝斌的ACM模板(目录篇)
- [ACM] 最短路算法整理(bellman_ford , SPFA , floyed , dijkstra 思想,步骤及模板)
- 邝斌的ACM模板(素数)
- 计算几何ACM模板
- trie树模板与KMP算法模板
- KMP算法_模板_C++
- ACM模板整理
- ACM 母函数模板 详解 + 理解!
- 黑猫的ACM模板
- ACM数论求最小公倍数(最大公约数)模板