Ex-KMP(模板)
首先,明白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(模板)的更多相关文章
- hdu 1686 KMP模板
// hdu 1686 KMP模板 // 没啥好说的,KMP裸题,这里是MP模板 #include <cstdio> #include <iostream> #include ...
- Oulipo HDU 1686 KMP模板
题目大意:求模式串在主串中的出现次数. 题目思路:KMP模板题 #include<iostream> #include<algorithm> #include<cstri ...
- KMP模板(bin)
KMP模板 主要是kuangbin的模板,之后加了一点我的习惯和理解. kmpN() 作用:构造next数组 参数:模式串,模式串长度 kmpC() 作用:返回模式串在主串中出现的次数(可重复) 参数 ...
- HDU 1711 - Number Sequence - [KMP模板题]
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1711 Time Limit: 10000/5000 MS (Java/Others) Memory L ...
- HDU 1711 Number Sequence(KMP模板)
http://acm.hdu.edu.cn/showproblem.php?pid=1711 这道题就是一个KMP模板. #include<iostream> #include<cs ...
- 剪花布条---hdu2087(kmp模板)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2087 kmp模板题: #include <cstdio> #include <cst ...
- Oulipo----poj3461(kmp模板)
题目链接:http://poj.org/problem?id=3461 和 减花布条 的题对比一下: 求s2中s1的个数kmp模板: #include<stdio.h> #include& ...
- kmp模板 && 扩展kmp模板
kmp模板: #include <bits/stdc++.h> #define PB push_back #define MP make_pair using namespace std; ...
- kuangbin专题16B(kmp模板)
题目链接: https://vjudge.net/contest/70325#problem/B 题意: 输出模式串在主串中出现的次数 思路: kmp模板 在 kmp 函数中匹配成功计数加一, 再令 ...
- [HDU1711]KMP模板
解题关键:1.直接套kmp模板即可,注意最后输出的位置,需要在索引的位置+1. 2.next用作数组名在oj中会编译错误, 3.选用g++,只有g++才会接受bits/stdc++.h OJ中g++和 ...
随机推荐
- 开源堡垒机jumpserver
开源堡垒机jumpserver 开源堡垒机jumpserver的安装 开源堡垒机jumpserver的配置和使用
- 交换机 路由器 防火墙asa 安全访问、配置 方式
这里交换机 路由器 暂时统称为 网络设备 我们一般管理网络设备采用的几种方法 一般来说,可以用5种方式来设置路由器: 1. Console口接终端或运行终端仿真软件的微机(第一次配置要使用此方式) ...
- Web渗透测试漏洞手册及修复建议
Web渗透测试漏洞手册及修复建议 0x0 配置管理 0x01 HTTP方法测试 漏洞介绍: 目标服务器启用了不安全的传输方法,如PUT.DELETE等,这些方法表示可能在服务器上使用了 WebDAV, ...
- sublime笔记
插件安装和使用 首先,要安装package control,按照官方方法安装: https://packagecontrol.io/installation 重启Sublime Text 3. 如果在 ...
- Shiro -- (四) 数据库支持
主要就是JdbcRealm这个类 先看一下部分源码: 先建表:users(用户名 / 密码).user_roles(用户 / 角色).roles_permissions(角色 / 权限),并且往use ...
- 《ASP.NET Core应用开发入门教程》与《ASP.NET Core 应用开发项目实战》正式出版
“全书之写印,实系初稿.有时公私琐务猬集,每写一句,三搁其笔:有时兴会淋漓,走笔疾书,絮絮不休:有时意趣萧索,执笔木坐,草草而止.每写一段,自助覆阅,辄摇其首,觉有大不妥者,即贴补重书,故剪刀浆糊乃不 ...
- ArcMap制图遇到的小问题
情况一 在attributes table中查看,发现是一条记录,实际上这一条记录由多个面要素组合而成,且彼此间没有交集,现在需要把他们全部分开来,单独独立变成一条要素记录 方法: Editor--& ...
- linux 基础入门(9) 系统服务 systemctl 与 xinted的运用
9.系统服务 9.1系统服务 可以把计算机理解为一个地点比如中关村大街系统服务理解为中关村大街的理发店.饭店.商场等等,每一个都是一个系统服务,为客户提供不同内容的服务 服务:常驻在内存中的程序,且可 ...
- LOJ #2877. 「JOISC 2014 Day2」交朋友 并查集+BFS
这种图论问题都挺考验小思维的. 首先,我们把从 $x$ 连出去两条边的都合并了. 然后再去合并从 $x$ 连出去一条原有边与一条新边的情况. 第一种情况直接枚举就行,第二种情况来一个多源 bfs 即可 ...
- MySql优化之mycat
1. 解压mycat,不要放在有中文目录的地方 下载地址:http://dl.mycat.io/1.6-RELEASE/2 .修改mycat解压目录下的conf文件夹中server.xml文件,配置 ...