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 ...
随机推荐
- webpack打包配置中出现的问题
第一个错误: One CLI for webpack must be installed. These are recommended choices, delivered as separate p ...
- POJ:3371 Connect the Cities(最小生成树)
http://acm.hdu.edu.cn/showproblem.php?pid=3371 AC代码: /** /*@author Victor /* C++ */ #include <bit ...
- VINS 检测回环辅助激光建图
最近接到一个任务,在激光检测回环失败时,比如黑色物体多,场景大等,可否利用视觉进行回环检测.如果只是检测回环,现有的许多框架都可以使用.ORB-SLAM本身就有单目模式,且效果不错.但是发现ORB在检 ...
- 【最新】 ELK之 logstash 同步数据库数据到Elasticsearch
cd /usr/local 下载logstash 6.4.3版本 wget https://artifacts.elastic.co/downloads/logstash/logstash-6.4.3 ...
- windows server 2012 R2修改默认远程端口
因客户现场网络复杂,将windows系统的默认远程端口3389归入安全策略中,所以服务器需要修改此端口,配置如下: 首先:登录操作系统,win+R调出运行菜单后输入regedit, 进入注册表编辑相关 ...
- 解压 xxxx.cpio.gz.u-boot
xxxx.cpio.gz.u-boot 为 Ramdisk 文件. 是使用u-boot源码下 tools/mkimage 工具生成的. .u-boot = 64字节的头部信息 + Filesystem ...
- Dubbox本地 JAR包部署与安装
Dubbox的jar包并没有部署到Maven的中央仓库中,大家在Maven的中央仓库中可以查找到Dubbo的最终版本是2.5.3 , 阿里巴巴解散了Dubbo团队后由当当网继续维护此项目,并改名为 D ...
- oracle client 卸载
1.停用oracle服务:进入计算机管理,在服务中,找到oracle开头的所有服务,右击选择停止 2.在开始菜单中,找到Universal Installer,运行Oracle Universal I ...
- ivew 修改排序号的逻辑
排序号修改的逻辑 1.构建修改排序号传递的参数 formInline2:{ recommendType:4, //产品类型 merchantCodes:[], //产品code discountRec ...
- string.format()详解
java中: 从 Java 5.0 开始,String 类新增了一个强大的字符串格式化方法 format().这个方法到现在用的人还是不多,实在是一种浪费.本文带你快速过一遍这个方法的功能,将来你要用 ...