关键词:
KMP算法是高速字符串匹配算法,朴素的暴力算法的时间复杂度为O(n*m)。而KMP通过对模式串进行对应的处理,可以达到O(m+n)的速度。
我们知道在字符串匹配的时候最消耗时间的就是当匹配到第 i 个位置发现不匹配时。下一次又对模式串进行一次又一次匹配,那么假如模式串中有非常多同样的字母的话,这样做了非常多反复的事情,那么我能够对模式串进行一定的处理。处理处一个相应的数组。让他保存假如这里不匹配是我下次应该从哪儿又一次開始。
每次当前的一个值是依据前面是否匹配的到。
这是预处理函数:
void getfill(string s) { memset(f,0,sizeof(f)); //依据其前一个字母得到 for(int 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 find(string a,string s) { getfill(s);int j=0; for(int 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()){ return i-s.size()+1; } } }
poj3461 。求一个模式串在字符串中的出现次数。
#include<cstdio> #include<cstring> #include<algorithm> #include <iostream> #include <string> using namespace std; int f[ 15000]; void getfill(string s) { memset(f,0,sizeof(f)); //依据其前一个字母得到 for(int 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 find(string a,string s) { int ans=0; getfill(s);int j=0; for(int 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()){ ans++; } } return ans; } int main() { string s,a; int T; scanf("%d",&T); while(T--) { getchar(); cin>>s>>a; int ans=find(a,s); printf("%d ",ans); } return 0; }
kmp模板
...include<bits/stdc++.h>usingnamespacestd;/*************************KMP模板****************************/intf[101];//优化后的失配指针,记住这里f要比P多一位,因为P到m-1即可,但是f还要计算出m的失配指针intf2[101];//f2用来保存KM指针,是为优化f的失配指... 查看详情
扩展kmp模板
扩展KMP指的是对于给出的串S和T,以O(n)的时间求出。对于所有0<=i<len(S),S(i,i+1,...,len(s)-1)与T的最长前缀长度。以下是模板:#include<iostream>#include<string>#include<stdio.h>#include<string.h>usingnamespacestd;c 查看详情
模板kmp算法
KMP算法用于字符串匹配1/*KMP*/2#include<stdio.h>3#include<string.h>4chars1[1000005],s2[1005];//s1为待匹配串,s2为模板串5intnxt[1005],n,m;6intmain()7{8scanf("%s%s",s1+1,s2+1);9n=strlen(s1+1);m=strlen(s2+1);10n 查看详情
kmp模板(代码片段)
今天又加深的理解了KMP认真看了这篇博客,感觉讲的还ok;然后带着理解写了洛谷的P3375字符串KMP模板题;#include<iostream>#include<cstdio>usingnamespacestd;constintmaxn=1e6+9;stringt,s;intNext[maxn];voidget_next()intlen=s.length();intk= 查看详情
算法模板之kmp
KMP#include<cstdio>#include<cstring>voidget_next(char*p,int*next){intpLen=strlen(p);next[0]=-1;intk=-1,j=0;while(j<pLen-1){if(k==-1||p[j]==p[k]){j++;k++;next[j]=k;}else{k=next[k];}}}int 查看详情
扩展kmp模板(代码片段)
...extend[i].具体extend的求法就不具体写了,这里只写求extend的模板.模板用到的数组charT[N 查看详情
扩展kmp模板(代码片段)
...extend[i].具体extend的求法就不具体写了,这里只写求extend的模板.模板用到的数组charT[N 查看详情
kmp模板(代码片段)
KMP的c++版模板例题HDU5918 http://acm.hdu.edu.cn/showproblem.php?pid=59181template<typenamefirst_T,typenamesecond_T>2voidkmp_init_next(constfirst_T*dec,3intdlen,4second_Tnext[])5inti,j;6j=next[0] 查看详情
扩展kmp模板(代码片段)
具体原理可以参考这里:扩展KMP、扩展KMP算法(刘毅)代码:1#include<iostream>2#include<cstdio>3#include<cstring>4#include<algorithm>5usingnamespacestd;6constintN=1e6+5;78intlen1,len2;9intnxt[N],extend[N] 查看详情
kmp模板~
#include<cstdio>#include<cstring>#include<iostream>#include<queue>#include<map>usingnamespacestd;intNext[100010];strings[100010];voidgetNext(strings){inti,j;i=0;j=-1;intl 查看详情
kmp模板
详解:http://www.cppblog.com/oosky/archive/2006/07/06/9486.htmlhttp://www.matrix67.com/blog/archives/115http://blog.csdn.net/v_july_v/article/details/7041827http://kb.cnblogs.com/page/176818/白书上的代码:#incl 查看详情
模板kmp
不断向失配处转移#include<iostream>#include<cstring>#include<cstdio>#include<algorithm>#definemaxn1000005usingnamespacestd;chart[maxn],p[maxn];intf[maxn];voidgetfail(char*p,int*f){intm= 查看详情
hdu2087剪花布条kmp模板题
...复制了……刚好数据结构也学了kmp找一道题敲敲模板……暴力的字符串匹配是O(n*m)的时间复杂度而kmp通过一个O(m)的预处理将字符串匹配的时间复杂度降到了O(n+m)kmp的核心是next数组的处理和利用next数组进行字符串... 查看详情
kmp模板
//kuangbin的模板:intS[maxn];intT[maxn];intnext_[maxn];inttlen,slen;voidGetNext(){intk=-1;next_[0]=-1;intj=0;while(j<tlen){if(k==-1||T[j]==T[k])next_[++j]=++k;elsek=next_[k];}}//返回第一个匹配字符串的起始位置下标intKMP 查看详情
kmp模板(代码片段)
/*pku3461(Oulipo),hdu1711(NumberSequence)这个模板字符串是从0开始的Next数组是从1开始的*/#include<iostream>#include<cstring>usingnamespacestd;constintN=1000002;intnext[N];charS[N],T[N];intslen,tlen;voidgetNext 查看详情
kmp算法模板
#include<stdio.h>#include<string.h>typedefstructseqstring{charstring[100];intlength;}seqstring;voidgetnext(seqstringp,intnext[]){inti,j;next[0]=-1;//next[0]放上-1i=0;//指向字符串每个字符的指针j=-1;while 查看详情
kmp模板
#include<iostream>#include<cstdio>#include<cstring>#definemxn1000001usingnamespacestd;charT[mxn],P[10001];intf[mxn];voidgetfail(){inti,j,m=strlen(P);for(i=1;i<m;i++){intj=f[i];whi 查看详情
kmp模板及总结
KMP是一种字符串匹配算法,它在时间复杂度上较暴力匹配算法由很大的优势。比如我要找字符串S中是否存在子串P,如果暴力匹配的话,则时间复杂度为O(n*m),而kmp算法时间复杂度为O(n+m)。这里我们有一个辅助的数组next[]... 查看详情