扩展KMP模板】的更多相关文章

kmp模板: #include <bits/stdc++.h> #define PB push_back #define MP make_pair using namespace std; typedef long long LL; typedef pair<int,int> PII; #define PI acos((double)-1) #define E exp(double(1)) #define K 1000000+9 +]; ]; //参数为模板串和next数组 //字…
对于一个字符串 s 以及子串 t ,扩展KMP可以用来求 t 与 s 的每个子串的最长公共前缀 ext [ i ],当然,如果有某个 ext 值等于 t 串的长度 lent ,那么就说明从其对应的 i 开始的一个长 lent 的子串即为 t 串,因此可以同样线性地求出 s 串中的每个 t 子串的出现位置与出现顺序. 首先感谢 xiaoxin 巨巨,基本是从他的模板上面理解而来的昂. 这里是助于我理解的满满注释版: #include<stdio.h> #include<string.h&g…
A Secret Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 256000/256000 K (Java/Others) Total Submission(s): 2523    Accepted Submission(s): 934 Problem Description Today is the birthday of SF,so VS gives two strings S1,S2 to SF as a present,w…
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(…
注意:需要用特殊符号隔开 1 struct ExKmp{ void Init(){ memset(f,,sizeof(f)); memset(r,,sizeof(r)); } void Get_Fail(){ f[]=lent; +f[]]==t[+f[]]) f[]+=;p=; ;i<=lent;i++){ ,L=f[i-p+]; <k)f[i]=L; else{ f[i]=max(,k-i+); +f[i]]==t[i+f[i]]) f[i]+=;p=i; } } } void Exkmp…
题目大意: 给定两个字符串,在第一个字符串中找到一个最大前缀作为第二个字符串的后缀 #include <iostream> #include <cstdio> #include <cstring> #include <algorithm> #include <vector> #include <queue> #include <climits> #include <cmath> #include <cst…
算法可以参考http://wenku.baidu.com/view/8e9ebefb0242a8956bece4b3.html 百度文库 #include<iostream> #include<string> using namespace std; ; int next[MM],extand[MM]; char S[MM],T[MM]; void GetNext(const char *T){ ; next[]=len; && T[a]==T[a+]) a++;…
procedure build_next; begin lena:=length(a);lenb:=length(b); next[]:=lenb;next[]:=lenb-; to lenb- ] then begin next[]:=i;break; end; k:=; to lenb-1 do begin p:=k+next[k]-;L:=next[i-k]; if i+L<=p then next[i]:=L else begin j:=p-i+; then j:=; while (i+…
题目链接:https://www.luogu.org/problem/P5410 题意:有两个字符串a,b,要求输出b与a的每一个后缀的最长公共前缀.输出: 第一行有lenb个数,为b的next数组(特别地,next1为lenb) 第二行有lena个数,即答案. 思路:扩展kmp模板,涉及字典树,后续再补,先放模板. AC code: #include<bits/stdc++.h> #define N 1000010 using namespace std; int q,nxt[N],exte…
题目大意: 给你两个字符串A,B,现在要你求B串的后缀在A串中出现的次数和后缀长度的乘积和为多少. 题解: 扩展KMP模板题,将A和B串都逆序以后就变成了求前缀的问题了,扩展KMP求处从i位置开始的最长公共前缀存于数组. 最后通过将数组的值不为0的进行一个桶计数,倒着进行一下求和就可以了.注意,在这个题目上扩展kmp处理出来的是 ex[ i ]数组是 A串的每个从 i 位置开始的后缀 ,与B串的最长公共前缀长度,那么这样B串在A串上匹配的情况就一目了然了. #include<bits/stdc+…