BZOJ2384:[CEOI2014]Match
浅谈\(KMP\):https://www.cnblogs.com/AKMer/p/10438148.html
题目传送门:https://lydsy.com/JudgeOnline/problem.php?id=2384
这是一种特殊的\(KMP\)。匹配不再是直接判断相等了。
假设现在\([1,j]\)和\([i-j,i-1]\)已经匹配上了,我要判断\(j+1\)与\(i\)是否能继续扩展。
其实很简单,我们只需要判断在\([1,j]\)里面\(j+1\)这一位的前驱和后继与\(j+1\)的相对位置是否在\([i-j,i-1]\)里面与\(i\)也满足同样的关系即可。
前驱和后继的相对位置可以利用链表倒着扫一遍求出来。
时间复杂度:\(O(n)\)
空间复杂度:\(O(n)\)
代码如下:
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
const int maxn=1e6+5;
int n,m,ans[maxn];
int pos[maxn],pre[maxn],nxt[maxn];
int a[maxn],b[maxn],s1[maxn],s2[maxn];
int read() {
int x=0,f=1;char ch=getchar();
for(;ch<'0'||ch>'9';ch=getchar())if(ch=='-')f=-1;
for(;ch>='0'&&ch<='9';ch=getchar())x=x*10+ch-'0';
return x*f;
}
bool check(int *x,int j,int i) {
return (!a[j]||x[i-a[j]]<x[i])&&(!b[j]||x[i-b[j]]>x[i]);
}
int main() {
n=read(),m=read();
for(int i=1;i<=n;i++) {
s1[pos[i]=read()]=i;
pre[i]=i-1,nxt[i]=i+1;
}
for(int i=1;i<=m;i++)s2[i]=read();
for(int i=n;i;i--) {
a[i]=pre[s1[i]]?i-pos[pre[s1[i]]]:0;
b[i]=nxt[s1[i]]!=n+1?i-pos[nxt[s1[i]]]:0;
if(pre[s1[i]])nxt[pre[s1[i]]]=nxt[s1[i]];
if(nxt[s1[i]]!=n+1)pre[nxt[s1[i]]]=pre[s1[i]];
}
memset(nxt,0,sizeof(nxt));
for(int i=2,j=0;i<=n;i++) {
while(j&&(!check(s1,j+1,i)))j=nxt[j];
if(check(s1,j+1,i))j++;nxt[i]=j;
}
for(int i=1,j=0;i<=m;i++) {
while(j&&(!check(s2,j+1,i)))j=nxt[j];
if(check(s2,j+1,i))j++;
if(j==n) {ans[++ans[0]]=i-n+1,j=nxt[j];}
}
printf("%d\n",ans[0]);
for(int i=1;i<=ans[0];i++)
printf("%d ",ans[i]);
return 0;
}
BZOJ2384:[CEOI2014]Match的更多相关文章
- 【BZOJ2384】[Ceoi2011]Match KMP
[BZOJ2384][Ceoi2011]Match Description 作为新一轮广告大战的一部分,格丁尼亚的一家大公司准备在城市的某处设置公司的标志(logo).公司经理决定用一些整栋的建筑来构 ...
- 一款免费好用的正则表达式工具:Regex Match Tracer
推荐分享:一款免费好用的正则表达式工具:Regex Match Tracer v2.1.5 free version 下载地址:Regex Match Tracer
- 检查正则表达式的工具:Regex Match Tracer
Regex Match Tracer破解版下载 使用: 相关: 收藏几个好用的在线正则验证网
- HDU3605:Marriage Match IV
Marriage Match IV Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others ...
- linux设备驱动归纳总结(八):2.match.probe.remove
linux设备驱动归纳总结(八):2.总线.设备和驱动的关系 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx ...
- HDU 3081:Marriage Match II(二分图匹配+并查集)
http://acm.hdu.edu.cn/showproblem.php?pid=3081 题意:有n个男生n个女生,他们只有没有争吵或者女生a与男生A没有争吵,且女生b与女生a是朋友,因此女生b也 ...
- [bzoj1892][bzoj2384][bzoj1461][Ceoi2011]Match/字符串的匹配_KMP_树状数组
2384: [Ceoi2011]Match 1892: Match 1461: 字符串的匹配 题目大意: 数据范围: 题解: 很巧妙的一道题呀. 需要对$KMP$算法有很深的理解才行. 首先我们需要发 ...
- C#反射调用 异常信息:Ambiguous match found.
异常信息(异常类型:System.Reflection.AmbiguousMatchException)异常提示:Ambiguous match found.异常信息:Ambiguous match ...
- 【bzoj2384】[Ceoi2011]Match 特殊匹配条件的KMP+树状数组
题目描述 给出两个长度分别为n.m的序列A.B,求出B的所有长度为n的连续子序列(子串),满足:序列中第i小的数在序列的Ai位置. 输入 第一行包含两个整数n, m (2≤n≤m≤1000000). ...
随机推荐
- Seaborn-05-Pairplot多变量图
转自:http://www.jianshu.com/p/6e18d21a4cad
- maven_00_资源帖
一.官方资料 Maven Getting Started Guide 二.精选资料 Maven for building Java applications - Tutorial Maven Tuto ...
- 在QT中使用静态对象
最近做教研室的项目,需要只能存在一个接收数据的线程,那么我就想把这个线程设置成一个静态对象.但是在connect信号与槽的时候出了一点问题,最后搞好了,现在这mark一下: 比如说一个声明了一个静态的 ...
- iOS二维码、条形码生成(可指定大小、颜色)
一.前言: iOS7.0之后可以利用系统原生 API 生成二维码, iOS8.0之后可以生成条形码, 系统默认生成的颜色是黑色. 在这里, 利用以下方法可以生成指定大小.指定颜色的二维码和条形码, 还 ...
- (转载)Android学习笔记⑨——android.content.ActivityNotFoundException异常处理
异常1:Java.lang.ClassNotFoundException 08-13 18:29:22.924: E/AndroidRuntime(1875):Caused by: Java.lang ...
- WiFi无线网络参数 802.11a/b/g/n 详解
转载自:WiFi无线网络参数 802.11a/b/g/n 详解 如转载侵犯您的版权,请联系:2378264731@qq.com 802.11a/b/g/n,其实指的是无线网络协议,细分为802.11a ...
- c# 数据库批量插入数据SqlBulkCopy 示例
/// <summary> /// 批量插入数据 /// </summary> public static void SqlBulkInsert(DataTable dt, s ...
- websocket基本概念
(1)websocket 协议 与 http协议 websocket 协议,双工通道 socket连接不断开 http 协议 ,只能请求响应 (用户主动获取) socket连接断开 都是基于socke ...
- php获取excel文件数据
很简单就可以实现,下面为大家简单介绍下 1.下载PHPExcel类,是一个文件夹,还得有一个文件PHPExcel.php,两个在同级目录 require __DIR__ . './PHPExcel/I ...
- asp.net string有多行文字
用如下格式设置