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 ...
随机推荐
- vue-router(路由)详细教程
vue-router(路由)详细教程:https://blog.csdn.net/wulala_hei/article/details/80488727 vue路由组件传参-页面通信:https:// ...
- 第一节 初识RabbitMQ
原文:第一节 初识RabbitMQ 版权声明:未经本人同意,不得转载该文章,谢谢 https://blog.csdn.net/phocus1/article/details/87280120 1.什么 ...
- C# 编程—字符串(方法应用)、数学Math函数、DateTime、异常捕获、其他
其他: #--任意位数字,有几位显示几位 0--至少以为数字,不足则补0 例如:#.00--必须保留两位小数 字符串(string): Length 长度 ...
- python bezier 曲线
1.手写bezier公式,生成bezier代码, 如果给的点数过多,则会生成一半bezier曲线,剩下的一半就需要进行拼接: import numpy as np import matplotlib. ...
- 几种RAID级别的比较
等级 概要 冗余 盘数 读快 写快 RAID 0 便宜.快速.危险 No N Yes Yes RAID 1 高速度.简单.安全 Yes 2(通常) Yes No RAID 5 安全(速度)成本折中 Y ...
- k8s--网络模式
1.clusterip kind: Service apiVersion: v1 metadata: name: my-service spec: selector: app: nginx ports ...
- C语言结构体实例-创建兔子
参考裸编程思想. #include <stdio.h> //#include "ycjobject.h" // 颜色定义 #define CL_BLACK 0 #def ...
- JavaSE---多线程---线程的控制
1.Java提供了一些工具方法,可以便捷控制线程的执行: 1.1 join Thread提供了让一个线程等待另一个线程执行完成的方法:join: 当某个程序的执行流中调用其他线程的join方法,该线程 ...
- java html生成PDF,并打印
import java.io.File; import java.io.FileOutputStream; import org.zefer.pd4ml.PD4Constants; import or ...
- 2019牛客多校第五场 B - generator 1 矩阵快速幂+十倍增+二进制倍增优化
B - generator 1 题意 给你\(x_{0}.x_{1}.a.b.b.mod\),根据\(x_{i} = a*x_{i-1} + b*x_{i-2}\)求出\(x_{n}\) 思路 一般看 ...