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模板的更多相关文章

  1. Manacher模板,kmp,扩展kmp,最小表示法模板

    *N]; //储存临时串 *N];//中间记录 int Manacher(char tmp[]) { int len=strlen(tmp); ; ;i<len;i++) { s[cnt++]= ...

  2. KMP和扩展KMP【转】

    这种东西基本上在纸上自己推导一下就能做出来XD 转发注明出处 KMP 给出两个字符串A(称为模板串)和B(称为子串),长度分别为lenA和lenB,要求在线性时间内,对于每个A[i] (0<=i ...

  3. KMP与扩展KMP

    原文转自:http://www.cppblog.com/MatoNo1/archive/2011/04/17/144390.aspx KMP:给出两个字符串A(称为模板串)和B(称为子串),长度分别为 ...

  4. KMP && Manacher && 扩展KMP整理

    KMP算法: kmp示例代码: void cal_next(char *str, int *next, int len) { next[0] = -1;//next[0]初始化为-1,-1表示不存在相 ...

  5. KMP 、扩展KMP、Manacher算法 总结

    一. KMP 1 找字符串x是否存在于y串中,或者存在了几次 HDU1711 Number Sequence HDU1686 Oulipo HDU2087 剪花布条 2.求多个字符串的最长公共子串 P ...

  6. 666 专题三 KMP &#38; 扩展KMP &#38; Manacher

    KMP: Problem A.Number Sequence d.求子串首次出现在主串中的位置 s. c. #include<iostream> #include<stdio.h&g ...

  7. KMP和扩展KMP

    文章网上太多这里提一下代码细节: KMP: scanf("%s\n",s); scanf("%s\n",t); int ls=strlen(s),lt=strl ...

  8. 【kmp或扩展kmp】HDU 6153 A Secret

    acm.hdu.edu.cn/showproblem.php?pid=6153 [题意] 给定字符串A和B,求B的所有后缀在A中出现次数与其长度的乘积之和 A和B的长度最大为1e6 方法一:扩展kmp ...

  9. KMP 和 扩展KMP

    KMP:在主串S中找子串T的位置KMP算法的时间复杂度O(|S|+|T|). #define maxn 1000 char s[maxn],t[maxn];//s为主串,t为子串 int net[ma ...

随机推荐

  1. 在Python中处理大型文件的最快方法

    我们需要处理的各种目录中有大约500GB的图像.每个图像的大小约为4MB,我们有一个python脚本,一次处理一个图像(它读取元数据并将其存储在数据库中).每个目录可能需要1-4小时才能处理,具体取决 ...

  2. js 基础 for in 和 for of的区别详解

    for in 和 for of 相对于大家肯定都不陌生,都是用来遍历属性的没错.那么先看下面的一个例子: 例1 const obj = { a: 1, b: 2, c: 3 } for (let i ...

  3. C#反射的实现

    一,什么是反射? 1,System.Reflection 命名空间中的类与 System.Type 使你能够获取有关加载的程序集和其中定义的类型的信息,如类.接口和值类型. 可以使用反射在运行时创建. ...

  4. OpenCV/Python/dlib眨眼检测

    今天我们来使用面部标志和OpenCV 检测和计算视频流中的眨眼次数. 为了构建我们的眨眼检测器,我们将计算一个称为眼睛纵横比(EAR)的指标,由Soukupová和Čech在其2016年的论文&quo ...

  5. 【记录】mysql中建表utf8和utf8mb4区别?timestamp和datetime区别?

    mysql中建表utf8和utf8mb4区别? 1:utf8 是 Mysql 中的一种字符集,只支持最长三个字节的 UTF-8字符,也就是 Unicode 中的基本多文本平面 2:要在 Mysql 中 ...

  6. awk 起始位置和长度和 mf 一致

    1位开始 , 925开始 截取24 awk '{OFS="";print(substr($0,925,24),substr($0,1,24),substr($0,436,1),&q ...

  7. CSIC_716_20191224【python基础结课作业--仿优酷练习】

    需 求:********管理员界面******** 1 注册 2 登录 3 上传视频 4 删除视频 5 发布公告 ********普通用户界面******** 1 注册 2 登录 3 冲会员 4 查看 ...

  8. Pycharm文档模板变量

    点击这里查看JetBrains官方英文源文件 本篇Blog只是搬运外加大概翻译一下. File template variables A file template can contain varia ...

  9. Vue select 绑定动态变量

    概述 根据后台的数据生成多个select,由于数据的数量不定,所以v-model绑定的变量名也不定.所以通过数据的id或者下标进行变量拼接.页面能够成功渲染,但是当进行下拉框的选值时,组件不刷新,选中 ...

  10. Python--nfs服务+计划任务crond服务+shell介绍

    nfs服务 NFS 是Network File System的缩写,即网络文件系统. 功能是通过网络让不同的机器.不同的操作系统能够彼此分享个别的数据,让应用程序在客户端通过网络访问位于服务器磁盘中的 ...