kmp与扩展kmp模板
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]==x[++j])next[i]=next[j];
40 else next[i]=j;
41 }
42 }*/
43
44 int kmp_count(){
45 int i,j;
46 int ans;
47 i=j=ans=0;
48 while(i<n){
49 while(-1!=j&&y[i]!=x[j])j=next[j];
50 i++;j++;
51 if(j>=m){
52 ans++;
53 j=next[j];
54 }
55 }
56 return ans;
57 }
58 };
59
60 int main()
61 {
62 KMP a;
63 while(a.init())
64 printf("%d\n",a.kmp_count());
65 return 0;
66 }
67 //如果n%(n-next[n])==0,则存在重复连续子串,长度为n-next[n]。

扩展kmp

1 #include <algorithm>
2 #include <iostream>
3 #include <cstring>
4 #include <cstdio>
5
6 using namespace std;
7
8 struct KZ_KMP{//求最长公共前缀
9 char y[1010];//主串
10 char x[1010];//模式串
11 int n,m;
12 int next[1010];//next[i]:x[i...m-1]与x[0...m-1]的最长公共前缀
13 int extend[1010];//extend[i]:y[i...n-1]与x[0...m-1]的最长公共前缀
14
15 int init(){
16 scanf("%s%s",y,x);
17 n=strlen(y);
18 m=strlen(x);
19 pre_EKMP();
20 EKMP();
21 return 1;
22 }
23
24 void pre_EKMP(){
25 next[0]=m;
26 int j=0;
27 while(j+1<m&&x[j]==x[j+1])j++;
28 next[1]=j;
29 int k=1;
30 for(int i=2;i<m;i++){
31 int p=next[k]+k-1;
32 int L=next[i-k];
33 if(i+L<p+1)next[i]=L;
34 else{
35 j=max(0,p-i+1);
36 while(i+j<m&&x[i+j]==x[j])j++;
37 next[i]=j;
38 k=i;
39 }
40 }
41 }
42
43 void EKMP(){
44 int j=0;
45 while(j<n&&j<m&&x[j]==y[j])j++;
46 extend[0]=j;
47 int k=0;
48 for(int i=1;i<n;i++){
49 int p=extend[k]+k-1;
50 int L=next[i-k];
51 if(i+L<p+1)extend[i]=L;
52 else{
53 j=max(0,p-i+1);
54 while(i+j<n&&j<m&&y[i+j]==x[j])j++;
55 extend[i]=j;
56 k=i;
57 }
58 }
59 //printf("%d ",extend[0]);
60 }
61 };
62
63 int main()
64 {
65 KZ_KMP a;
66 while(a.init()){
67 }
68 return 0;
69 }

kmp与扩展kmp模板的更多相关文章
- Manacher模板,kmp,扩展kmp,最小表示法模板
*N]; //储存临时串 *N];//中间记录 int Manacher(char tmp[]) { int len=strlen(tmp); ; ;i<len;i++) { s[cnt++]= ...
- KMP和扩展KMP【转】
这种东西基本上在纸上自己推导一下就能做出来XD 转发注明出处 KMP 给出两个字符串A(称为模板串)和B(称为子串),长度分别为lenA和lenB,要求在线性时间内,对于每个A[i] (0<=i ...
- KMP与扩展KMP
原文转自:http://www.cppblog.com/MatoNo1/archive/2011/04/17/144390.aspx KMP:给出两个字符串A(称为模板串)和B(称为子串),长度分别为 ...
- KMP && Manacher && 扩展KMP整理
KMP算法: kmp示例代码: void cal_next(char *str, int *next, int len) { next[0] = -1;//next[0]初始化为-1,-1表示不存在相 ...
- KMP 、扩展KMP、Manacher算法 总结
一. KMP 1 找字符串x是否存在于y串中,或者存在了几次 HDU1711 Number Sequence HDU1686 Oulipo HDU2087 剪花布条 2.求多个字符串的最长公共子串 P ...
- 666 专题三 KMP & 扩展KMP & Manacher
KMP: Problem A.Number Sequence d.求子串首次出现在主串中的位置 s. c. #include<iostream> #include<stdio.h&g ...
- KMP和扩展KMP
文章网上太多这里提一下代码细节: KMP: scanf("%s\n",s); scanf("%s\n",t); int ls=strlen(s),lt=strl ...
- 【kmp或扩展kmp】HDU 6153 A Secret
acm.hdu.edu.cn/showproblem.php?pid=6153 [题意] 给定字符串A和B,求B的所有后缀在A中出现次数与其长度的乘积之和 A和B的长度最大为1e6 方法一:扩展kmp ...
- KMP 和 扩展KMP
KMP:在主串S中找子串T的位置KMP算法的时间复杂度O(|S|+|T|). #define maxn 1000 char s[maxn],t[maxn];//s为主串,t为子串 int net[ma ...
随机推荐
- spring注解开发:Configuration&Bean
1.使用xml创建bean的方式 1.首先新建一个maven工程,添加如下依赖 <dependency> <groupId>org.springframework</gr ...
- [fw]GDT是在分段中為了相容real mode 跟 protected mode的產物
在Protected Mode下,一个重要的必不可少的数据结构就是GDT(Global Descriptor Table). 为什么要有GDT?我们首先考虑一下在Real Mode下的编程模型: 在R ...
- HDU 1029Ignatius and the Princess IV
Ignatius and the Princess IV Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32767 K ( ...
- 【彩彩只能变身队(第七组)】Alpha版
演示总结 -by 彩彩只能变身组(第七组) Part one:功能简介 教师端——班级主页 教师端——创建班级 教师端——批改作业 教师端——作业上交情况 学生端——班级主页 学生端——作业上传 在开 ...
- 项目部署到IIS后,明明存在某个文件,但是访问却返回404
项目部署到IIS后,明明存在某个文件,但是访问却返回404,这是为什么呢,原因很可能是未添加MIME类型 比如我的文件名是“iconfont.woff” 打开IIS,点击对应的项目,右面展示的是下图 ...
- 如何判断一个List集合中是否有空值
list.Any(v => string.IsNullOrWhiteSpace(v))
- 解决 Failed to load class "org.slf4j.impl.StaticLoggerBinder"
我们在使用日志记录网站或者应用时,有时候启动会出现这个告警: SLF4J: Failed to load class "org.slf4j.impl.StaticLoggerBinder&q ...
- PL/SQL to update all columns
undefine schema_name; declare l_Err ); begin for r in (select atc.table_name, atc.column_name, atc.d ...
- 解决 'express' 不是内部或外部命令,也不是可运行的程序
express-generator >npm install -g express-generator 就可以了
- 第07章 JdbcTemplate
第07章JdbcTemplate 1. 概述 为了使JDBC更加易于使用,Spring在JDBC API上定义了一个抽象层,以此建立一个JDBC存取框架. 作为Spring JDBC框架的核心,JDB ...