浅谈\(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的更多相关文章

  1. 【BZOJ2384】[Ceoi2011]Match KMP

    [BZOJ2384][Ceoi2011]Match Description 作为新一轮广告大战的一部分,格丁尼亚的一家大公司准备在城市的某处设置公司的标志(logo).公司经理决定用一些整栋的建筑来构 ...

  2. 一款免费好用的正则表达式工具:Regex Match Tracer

    推荐分享:一款免费好用的正则表达式工具:Regex Match Tracer  v2.1.5  free version 下载地址:Regex Match Tracer

  3. 检查正则表达式的工具:Regex Match Tracer

    Regex Match Tracer破解版下载 使用: 相关: 收藏几个好用的在线正则验证网

  4. HDU3605:Marriage Match IV

    Marriage Match IV Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others ...

  5. linux设备驱动归纳总结(八):2.match.probe.remove

    linux设备驱动归纳总结(八):2.总线.设备和驱动的关系 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx ...

  6. HDU 3081:Marriage Match II(二分图匹配+并查集)

    http://acm.hdu.edu.cn/showproblem.php?pid=3081 题意:有n个男生n个女生,他们只有没有争吵或者女生a与男生A没有争吵,且女生b与女生a是朋友,因此女生b也 ...

  7. [bzoj1892][bzoj2384][bzoj1461][Ceoi2011]Match/字符串的匹配_KMP_树状数组

    2384: [Ceoi2011]Match 1892: Match 1461: 字符串的匹配 题目大意: 数据范围: 题解: 很巧妙的一道题呀. 需要对$KMP$算法有很深的理解才行. 首先我们需要发 ...

  8. C#反射调用 异常信息:Ambiguous match found.

    异常信息(异常类型:System.Reflection.AmbiguousMatchException)异常提示:Ambiguous match found.异常信息:Ambiguous match ...

  9. 【bzoj2384】[Ceoi2011]Match 特殊匹配条件的KMP+树状数组

    题目描述 给出两个长度分别为n.m的序列A.B,求出B的所有长度为n的连续子序列(子串),满足:序列中第i小的数在序列的Ai位置. 输入 第一行包含两个整数n, m (2≤n≤m≤1000000).  ...

随机推荐

  1. 聊一聊Spring AOP

    前两天,在给新入职的同事做技术介绍时,讲到spring的AOP.使我又一次认识到,对于AOP,特别是spring AOP的理解,虽然大家都能说上来几句,但是许多人认识并不太全面,甚至可以说是一知半解- ...

  2. 项目提交到github的忽略文件

    1.在工作区的.gitignore文件中配置如下: # Built application files*.apk*.ap_ # Files for the Dalvik VM*.dex # Java ...

  3. python之阶乘的小例子

    现在自己写阶乘是这个样子的 def f(x): return x * f(x-1) if x >1 else 1 后来无意中看到耗子的一篇<Python程序员的进化>的文章, 感脚这 ...

  4. 复位compiz和unity

    compiz是最最不稳定的组件....绝大部分死机(图形界面没反应)都是由于这货. 所以为了我们系统的稳定,最好不要蛋疼去修改compiz的配置添加神马3D特效,这样导致更不稳定,这样做之后估计你一整 ...

  5. 【LeetCode 88_数组】Merge Sorted Array

    void merge(vector<int>& nums1, int m, vector<int>& nums2, int n) { ; ; ; &&a ...

  6. L167

  7. Python面向对象的三大特征 --- 封装、继承、多态

    一.封装 1)封装:是面向对象的一大特点:将属性和方法封装在一个抽象类中.外界使用类创建对象,然后让对象调用内部方法.对象方法的细节都被封装在类的内部. class Person():   def _ ...

  8. svn 图标状态说明

    http://blog.csdn.net/coslay/article/details/41980131

  9. Kafka消费者生产者实例

    为了更为直观展示Kafka的消息生产消费的过程,我会从基于Console和基于Application两个方面介绍使用实例.Kafka是一个分布式流处理平台,具体来说有三层含义: 它允许发布和订阅记录流 ...

  10. 文件处理工具 gif合成工具 文件后缀批量添加工具 文件夹搜索工具 重复文件查找工具 网页图片解析下载工具等

    以下都是一些简单的免费分享的工具,技术支持群:592132877,提供定制化服务开发. Gif动图合成工具 主要功能是扫描指定的文件夹里的所有zip文件,然后提取Zip文件中的图片,并合成一张gif图 ...