首先,明白Ex-KMP是干什么的:

给定两个字符串母串S和子串T(长度分别为n和m),下标从0开始,定义extend[i]等于S[i]…S[n-1]与T的最长公共前缀的长度,求出所有的extend[i]。

简单来说,就是求母串的每个后缀与子串的最长公共前缀长度,存在extend数组中。
即:一个母串,一个子串,多次匹配


例题链接:J - 好吃不过饺子
两个数组,a[n]和b[m],若有一个数k使得 a[k]+b[0]=a[k+1]+b[1]…=a[k+m-1]+b[m-1],求所有满足条件的k。
输入第一行为n和m,第二行为a[n],第三行为b[m]。
要求输出第一行为k的个数,第二行升序输出所有满足要求的k值。

很明显,a[k]=b[0],a[k+1]=b[1] … a[k+m-1]=b[m-1],
拿出来就是,a[k]到a[k+m-1] 等于 b[0]到b[m-1]

代码如下:

#include<cstdio>
#include<cstring>
using namespace std;
const int maxn = 1e5 + 5;  //字符串长度最大值
int as[maxn], bs[maxn], a[maxn], b[maxn], ans[maxn];
int n, m;
int Next[maxn], ex[maxn]; //ex数组即为extend数组  void GETNEXT(int *str) //预处理计算next数组
{int i = 0, j, po, len = m - 1;Next[0] = len;//初始化Next[0]  while (str[i] == str[i + 1] && i + 1<len)//计算Next[1]  i++;Next[1] = i;po = 1;//初始化po的位置  for (i = 2; i<len; i++){if (Next[i - po] + i<Next[po] + po)//第一种情况,可以直接得到Next[i]的值  Next[i] = Next[i - po];else//第二种情况,要继续匹配才能得到Next[i]的值  {j = Next[po] + po - i;if (j<0)j = 0;//如果i>po+Next[po],则要从头开始匹配  while (i + j<len&&str[j] == str[j + i])//计算Next[i]  j++;Next[i] = j;po = i;//更新po的位置  }}
}//计算extend数组
void EXKMP(int *s1, int *s2)
{int i = 0, j, po, len = n-1, l2 = m-1;GETNEXT(s2);//计算子串的next数组  while (s1[i] == s2[i] && i<l2&&i<len)//计算ex[0]  i++;ex[0] = i;po = 0;//初始化po的位置  for (i = 1; i<len; i++){if (Next[i - po] + i<ex[po] + po)//第一种情况,直接可以得到ex[i]的值  ex[i] = Next[i - po];else//第二种情况,要继续匹配才能得到ex[i]的值  {j = ex[po] + po - i;if (j<0)j = 0;//如果i>ex[po]+po则要从头开始匹配  while (i + j<len&&j<l2&&s1[j + i] == s2[j])//计算ex[i]  j++;ex[i] = j;po = i;//更新po的位置  }}
}int main() {scanf("%d %d", &n, &m);for (int i = 0; i < n; i++) scanf("%d", &a[i]);for (int i = 0; i < n - 1; i++) as[i] = a[i] - a[i + 1];for (int i = 0; i < m; i++) scanf("%d", &b[i]);for (int i = 0; i < m - 1; i++) bs[i] = b[i + 1] - b[i];memset(Next, 0, sizeof(Next));EXKMP(as, bs);int cnt = 0;for (int i = 0; i < n - 1; i++) if (ex[i] == m - 1) {ans[cnt++] = i;}printf("%d\n", cnt);for (int i = 0; i < cnt; i++) printf("%d ", ans[i]);return 0;
}

Ex-KMP(模板)相关推荐

  1. kuangbin专题16B(kmp模板)

    题目链接: https://vjudge.net/contest/70325#problem/B 题意: 输出模式串在主串中出现的次数 思路: kmp模板 在 kmp 函数中匹配成功计数加一, 再令 ...

  2. HDU 1711 Number Sequence(KMP模板)

    http://acm.hdu.edu.cn/showproblem.php?pid=1711 这道题就是一个KMP模板. 1 #include<iostream> 2 #include&l ...

  3. POJ:3461-Oulipo(KMP模板题)

    原题传送:http://poj.org/problem?id=3461 Oulipo Time Limit: 1000MS Memory Limit: 65536K Description The F ...

  4. 扩展KMP模板(学习)

    学习链接:https://www.luogu.org/problemnew/solution/P5410 一.引言 一个算是冷门的算法(在竞赛上),不过其算法思想值得深究. 二.前置知识 kmp的算法 ...

  5. Oulipo(欧力波)(经典kmp模板题) HDU-1686

    题目:Oulipo(欧力波) 中文大意 The French author Georges Perec (1936�C1982) once wrote a book, La disparition, ...

  6. POJ Oulipo(KMP模板题)

    题意:找出模板在文本串中出现的次数 思路:KMP模板题 #include<cstdio> #include<cstring> #include<cmath> #in ...

  7. Codeforce-126B:Password(KMP模板题)

    题目链接:点击打开链接 题目大意: 给你一个串,让你求这个串的一个同时是前缀,后缀(这个说法好像不太对)且在串中出现过的最长子串. 举个例子: 对于串 fixprefixsdfix 就应该输出fix. ...

  8. 【KMP模板】简单写个KMP~

    本来easy的KMP 却一直过不了洛谷的模板题... 仔细一看原来在输出next数组时打的回车而不是空格... 身败名裂... 话说有个sunday貌似一般状况下比KMP快呢...去看看2333 #i ...

  9. [kmp+模板] kmp模板

    文章目录 0. 前言 1. kmp 0. 前言 Biu kmp 模式匹配算法很牛,一般结合 kmp 的题目都不怎么简单,或是困难题目可以采用 kmp 的思想很快搞定,之前博文有写过 kmp· 算法原理 ...

  10. KMP 模板题 及next数组

    每天都在憧憬这些算法我都懂了的那一天...然鹅,KMP又看了一遍还是觉得稀里糊涂的.先放个模板题好了(:′⌒`) [hdu1711] Number Sequence Time Limit: 10000 ...

最新文章

  1. ux设计_从UX设计人员的角度来看Microsoft Build 2018
  2. vCenter- vcsa6.7/7.0重置root密码
  3. 初识OneNote 2016
  4. (59) 解决在列表视图复制导致打开详细内容
  5. MyEclipse或者Eclipse的小图标含义详解
  6. pytorch transformers
  7. 拓端tecdat|在R语言中使用概率分布:dnorm,pnorm,qnorm和rnorm
  8. 厉害了!图解 23 种设计模式,终于有人讲清楚了!面试揭秘
  9. 在阿里云注册域名后怎样进行网站的备案流程
  10. 纯CSS实现数据上报和HTML验证
  11. 墨门云文件加密系统有哪些功能特点?
  12. Elang在Windows console下显示中文
  13. 计算机编程术语(中英文对照)
  14. 监狱逃离 51nod1299 最小割
  15. android禁用模拟器,Android 禁止应用在模拟器上运行
  16. java实现飞机大战小游戏——————【附素材、源码、逐行注释讲解】
  17. 192-神以恩典为你年岁的冠冕
  18. JAVA之电话号码加密
  19. 魔百盒M301H(ZN、JL、CW、SM代工)_海思3798mv300_全套刷机固件
  20. C语言顺序栈实现代码

热门文章

  1. 《操作系统真象还原》第二章
  2. 骨传导为什么比气传导好,骨传导耳机还有这么多优势!
  3. 嵌入式系统工程化设计4
  4. 码云简易上传的详细说明
  5. HBase:Hive与HBase的整合
  6. GPS模块(GPS-NEO-6M)
  7. 5W字讲解最新大数据面试题
  8. 【xitongshoucang.com】全方位对Shift键大揭秘
  9. Bps,bps,pps 等的计算
  10. CF(Div. 1 + Div. 2) E. Carrots for Rabbits(优先队列+贪心)