kmp

kmp模板

我的梦境 提交于 2020-01-16 00:01:39
模板题: https://www.luogu.org/problem/P3375 学习了kmp算法,虽然不是太懂,贴一个模板先。 #include <iostream> #include <stdio.h> #include <stdlib.h> #include <string.h> #define MAXN 1000010 using namespace std; char s1[MAXN],s2[MAXN]; int nxt[MAXN],f[MAXN],len1,len2; void CalcNext() { for(int i=2,j=0;i<=len2;i++) { while(j>0&&s2[i]!=s2[j+1]) j=nxt[j]; if(s2[i]==s2[j+1]) j++; nxt[i]=j; } } void Kmp() { for(int i=1,j=0;i<=len1;i++) { while(j>0&&(j==len2||s1[i]!=s2[j+1])) j=nxt[j]; if(s1[i]==s2[j+1]) j++; f[i]=j; //如果f[i]==len2说明s1以第i位结尾的字串和s2成功匹配 } } int main() { scanf("%s %s",s1+1,s2+1); len1=strlen(s1+1); len2=strlen

字符串匹配KMP算法

亡梦爱人 提交于 2020-01-14 11:06:19
字符串匹配KMP算法   KMP 算法是 D.E.Knuth、J,H,Morris 和 V.R.Pratt 三位神人共同提出的,称之为 Knuth-Morria-Pratt 算法,简称 KMP 算法。该算法相对于 Brute-Force(暴力)算法有比较大的改进,主要是消除了主串指针的回溯,从而使算法效率有了某种程度的提高。 一、问题描述 给定一个主串S及一个模式串P,判断模式串是否为主串的子串;若是,返回匹配的第一个元素的位置(序号从1开始),否则返回0;如S=“abcd”,P=“bcd”,则返回2;S=“abcd”,P=“acb”,返回0。 二、KMP算法 上面说道 KMP 算法主要是通过消除主串指针的回溯来提高匹配的效率的,那么,它是则呢样来消除回溯的呢?就是因为它提取并运用了加速匹配的信息! 朴素算法中,P的第j位失配,默认的把P串后移一位。 但在前一轮的比较中,我们已经知道了P的前(j-1)位与S中间对应的某(j-1)个元素已经匹配成功了。这就意味着,在一轮的尝试匹配中,我们get到了主串的部分内容,我们能否利用这些内容,让P多移几位(我认为这就是KMP算法最根本的东西),减少遍历的趟数呢?答案是肯定的。再看下面改进后的动图:      这个模拟过程即KMP算法,每次失配,S串的索引i不动,P串的索引j定位到某个数。T(n)=O(n+m),时间效率明显提高 而这

扩展KMP模板

送分小仙女□ 提交于 2020-01-14 04:48:54
具体原理可以参考这里: 扩展KMP 、 扩展KMP算法(刘毅) 代码: 1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include<algorithm> 5 using namespace std; 6 const int N=1e6+5; 7 8 int len1,len2; 9 int nxt[N],extend[N]; //nxt[i]表示t[0...len2-1]和t[i...len2-1]的最大公共前缀长度 10 //extend[i]表示s[i...len1-1]和t[0...len2-1]的最大公共前缀长度 11 12 //获得next[i](0<=i<=len(t)),跟ex_kmp()类似,相当于字符串自身t匹配,t[i..len2-1]和t[0...len2-1]和等价于s和t 13 void getnext(char *t){ 14 int a,p,len; 15 len=strlen(t); 16 nxt[0]=len; 17 for(int i=1,j=-1;i<len;i++,j--){ 18 if(j<0||i+nxt[i-a]>=p){ 19 if(j<0) 20 p=i,j=0; 21 while(p<len&&t[p]==t[j]) 22 p++,j++; 23

poj 3461 Oulipo(KMP)

我怕爱的太早我们不能终老 提交于 2020-01-14 00:19:37
题目链接: http://poj.org/problem?id=3461 思路分析: 字符串匹配问题,使用KMP算法解决。 代码如下: #include <stdio.h> char T[1000005], W[10005]; int Next[10005]; int Len_T, Len_W; void GetNext( ) { int i = 0, j = -1; Next[0] = -1; if ( W[0] == '\0' ) return; while ( i < Len_W ) { if ( j == -1 || W[i] == W[j] ) { ++i; ++j; Next[i] = j; } else j = Next[j]; } } int Matcher( ) { int i = 0, j = 0, Count = 0; while ( i < Len_T ) { if ( j == -1 || T[i] == W[j] ) { ++i; ++j; } else j = Next[j]; if( j == Len_W ) Count++; } return Count; } int main( ) { int n; scanf( "%d\n", &n ); while ( n-- ) { int ans; char Tmp; Len_T = Len_W = 0;

kmp与扩展kmp模板

北城以北 提交于 2020-01-13 13:53:07
kmp 1 #include <algorithm> 2 #include <iostream> 3 #include <cstring> 4 #include <cstdio> 5 6 using namespace std; 7 8 struct KMP{ 9 char y[1010];//主串 10 char x[1010];//模式串 11 int n,m; 12 int next[1010]; 13 14 int init(){ 15 scanf("%s%s",y,x); 16 n=strlen(y); 17 m=strlen(x); 18 kmp_pre(); 19 //prekmp(); 20 return 1; 21 } 22 23 void kmp_pre(){//生成next数组 24 int i,j; 25 j=next[0]=-1; 26 i=0; 27 while(i<m){ 28 while(-1!=j&&x[i]!=x[j])j=next[j]; 29 next[++i]=++j; 30 } 31 } 32 33 /*void prekmp(){ 34 int i,j; 35 j=next[0]=-1; 36 i=0; 37 while(i<m){ 38 while(-1!=j&&x[i]!=x[j])j=next[j]; 39 if(x[++i]=

poj 3461 Oulipo,裸kmp

江枫思渺然 提交于 2020-01-13 08:33:46
传送门 Oulipo Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 32373 Accepted: 13093 Description The French author Georges Perec (1936–1982) once wrote a book, La disparition, without the letter 'e' . He was a member of the Oulipo group. A quote from the book: Tout avait Pair normal, mais tout s’affirmait faux. Tout avait Fair normal, d’abord, puis surgissait l’inhumain, l’affolant. Il aurait voulu savoir où s’articulait l’association qui l’unissait au roman : stir son tapis, assaillant à tout instant son imagination, l’intuition d’un tabou, la vision d’un mal obscur, d’un quoi vacant,

扩展kmp模板

我们两清 提交于 2020-01-13 05:41:02
#include<iostream> #include<cstdio> #include<cstring> #include<string> #include<set> #include<vector> #include<queue> #include<map> #include<algorithm> #include<cmath> #include<stdlib.h> #include<time.h> using namespace std; #define mmax 100000+10 void extendkmp(char *a,char *b,int m,int n,int *next,int *ret){ int i,j,k; memset(next,0,sizeof(next)); for(j=0;1+j<m&&a[j]==a[1+j];j++); next[1]=j; k=1; for(i=2;i<m;i++){ int len=k+next[k],l=next[i-k]; if(l<len-i){ next[i]=l; } else{ for(j=max(0,len-i);i+j<m&&a[j]==a[i+j];j++); next[i]=j; k=i; } } for(j=0;j<n&&j<m&&a[j]==b[j];j++); ret[0]=j; k=0;

扩展KMP模板

微笑、不失礼 提交于 2020-01-12 17:07:53
注意:需要用特殊符号隔开 1 struct ExKmp{ 2 void Init(){ 3 memset(f,0,sizeof(f)); 4 memset(r,0,sizeof(r)); 5 } 6 7 void Get_Fail(){ 8 f[1]=lent; 9 while(t[2+f[2]]==t[1+f[2]]) 10 f[2]+=1;p=2; 11 for(int i=3;i<=lent;i++){ 12 int k=p+f[p]-1,L=f[i-p+1]; 13 if(i+L-1<k)f[i]=L; 14 else{ 15 f[i]=max(0,k-i+1); 16 while(t[1+f[i]]==t[i+f[i]]) 17 f[i]+=1;p=i; 18 } 19 } 20 } 21 22 void Exkmp(){ 23 Init();Get_Fail(); 24 while(s[1+r[1]]==t[1+r[1]]) 25 r[1]++;p=1; 26 for(int i=2;i<=lens;i++){ 27 int k=p+r[p]-1,L=f[i-p+1]; 28 if(i+L-1<k)r[i]=L; 29 else{ 30 r[i]=max(0,k-i+1); 31 while(t[1+r[i]]==s[i+r[i]]) 32 r[i]+=1;p=i;

kmp与扩展kmp模板

假如想象 提交于 2020-01-12 08:25:43
kmp 1 #include <algorithm> 2 #include <iostream> 3 #include <cstring> 4 #include <cstdio> 5 6 using namespace std; 7 8 struct KMP{ 9 char y[1010];//主串 10 char x[1010];//模式串 11 int n,m; 12 int next[1010]; 13 14 int init(){ 15 scanf("%s%s",y,x); 16 n=strlen(y); 17 m=strlen(x); 18 kmp_pre(); 19 //prekmp(); 20 return 1; 21 } 22 23 void kmp_pre(){//生成next数组 24 int i,j; 25 j=next[0]=-1; 26 i=0; 27 while(i<m){ 28 while(-1!=j&&x[i]!=x[j])j=next[j]; 29 next[++i]=++j; 30 } 31 } 32 33 /*void prekmp(){ 34 int i,j; 35 j=next[0]=-1; 36 i=0; 37 while(i<m){ 38 while(-1!=j&&x[i]!=x[j])j=next[j]; 39 if(x[++i]=

Oulipo (kmp)

核能气质少年 提交于 2020-01-11 13:36:00
Oulipo Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 26857 Accepted: 10709 Description The French author Georges Perec (1936–1982) once wrote a book, La disparition, without the letter 'e' . He was a member of the Oulipo group. A quote from the book: Tout avait Pair normal, mais tout s’affirmait faux. Tout avait Fair normal, d’abord, puis surgissait l’inhumain, l’affolant. Il aurait voulu savoir où s’articulait l’association qui l’unissait au roman : stir son tapis, assaillant à tout instant son imagination, l’intuition d’un tabou, la vision d’un mal obscur, d’un quoi vacant, d’un