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. Springboot02-配置文件

    配置文件读取 springboot中的配置文件都放在application.properties中,其中而k-v属性可以通过@Value("${属性名}")直接获取 @Compon ...

  2. BZOJ 2724蒲公英 (分块) 【内有块大小证明】

    题面 luogu传送门 分析 先分块,设块大小为x(之后我们会证明块大小取何值会更优) 步骤1 把所有的数离散化,然后对每个值开一个vector pos[i],pos[i]存储数i出现的位置 我们设查 ...

  3. luoguP1514 引水入城 题解(NOIP2010)(Bfs+贪心)

    P1514 引水入城  题目 #include<iostream> #include<cstdlib> #include<cstdio> #include<c ...

  4. [fw]error: aggregate value used where an integer was expected

    一個自訂struct型態的變數,若想要轉換為unsigned,直接使用cast,gcc(version 4.4.3)編譯會回報錯誤. 例如: struct _test { unsigned hour ...

  5. C/C++语言for循环语句执行顺序

    for循环如下: ; i<; ++i) { } 执行顺序如下: 1.i=0  初始化初值 2.i<10 进行判断,如果条件为真,则继续执行 3.执行循环体代码 4.i++ 变量i自增 5. ...

  6. WPF-将DataGrid控件中的数据导出到Excel

    原文:WPF-将DataGrid控件中的数据导出到Excel 导出至Excel是非常常见,我们可以用很多类库,例如Aspose.NOPI.Interop,在这里我们使用微软自家的工具.我的WPF绑定的 ...

  7. kubernetes集群的安装异常汇---docker的驱动引擎

    异常[kubelet cgroup driver:cgroupfs跟docker cgroup driver:systemd不一致] 异常描述 error: failed to run Kubelet ...

  8. WPF 基本图形

    一.WPF的基本图形 WPF图形的基类是Shape,所有的wpf图形类都是继承于Shape.Height,Width等决定它所处的面积,位置等,在没有设置图形宽高的情况,坐标位置为所在的容器的坐标,设 ...

  9. Nginx实现rewrite重写

    目录 Rewrite基本概述 Rewrite标记Flag Rewrite规则实践 Rewrite场景示例 Rewrite规则补充 rewrite优先级实战 Rewrite基本概述 什么是rewrite ...

  10. Dev常用控件

    GridControl TreeView DEV GridControl小结.. https://blog.csdn.net/happy09li/article/details/7186829 Dev ...