【BZOJ2384】[Ceoi2011]Match

Description

作为新一轮广告大战的一部分,格丁尼亚的一家大公司准备在城市的某处设置公司的标志(logo)。公司经理决定用一些整栋的建筑来构成标志的组成部分。
v标志由不同高度的竖直条纹组成。这些条纹从左到右依次编号为1…n。标志用数字1,2,…,n的排列(s1,s2,…,sn)来描述。编号s1的条纹高度最低,编号s2的条纹第二低,…,编号sn的条纹最高。条纹的实际高度无关紧要。 
v沿格丁尼亚城市的主干道共有m栋建筑,这些建筑的高度各不相同。问题是如何找出标志与建筑相匹配的所有位置。 
v请帮助公司找出匹配标志的建筑序列的连续部分。若编号s1的建筑在序列中最低,编号s2的建筑在序列中第二低,…,那么这个连续的建筑序列就与标志匹配。例如,建筑高度的序列5,10,4与用编号排列(3,1,2)描述的标志相匹配,因为编号3的建筑(高度4)最低,编号1的建筑第二低,编号2的建筑最高

Input

◆第一行包含两个整数n, m (2≤n≤m≤1000000)。 
   第二行包含n个整数si,构成1,2,…,n的排列,1≤si≤n且si≠sj。 
   第三行包含m个整数hi,表示建筑的高度(1≤hi≤109,1≤i≤m),所有的hi均不相同。 
   每一行的整数之间用单个空格隔开。 
◆至少35分的数据,n≤5000, m≤2000 
◆至少60分的数据,n≤50000, m≤200000

Output

第一行包含1 个整数k ,表示匹配的序列数目。
 第二行包含k 个整数,分别为在正确匹配的每个序列中与标志编号1 的条纹相对应的第1 栋建筑的编号。这些数字按升序排列,用空格隔开。如果k=0 ,第二行为空行。

Sample Input

5 10
2 1 5 3 4
5 6 3 8 12 7 1 10 11 9

Sample Output

2
2 6

题解:本题肯定是KMP,然后改一改判断相等的条件即可。但是拿什么作为判相等的条件呢?一开始想到用每个数前面第一个比它小+大的数的位置,但后来找到反例了。发现题解维护的是每个数前面所有比它小的数中,最大的数的位置(即刚好比它小的数的位置),和刚好比它大的数的位置。然后只要S中的对应位置也满足对应的关系,就认为是相等。

#include <cstdio>
#include <cstring>
#include <iostream> using namespace std;
const int maxn=1000010;
int n,m,t1,t2;
int S[maxn],T[maxn],pos[maxn],p1[maxn],p2[maxn],pre[maxn],nxt[maxn],next[maxn],ans[maxn];
inline int rd()
{
int ret=0,f=1; char gc=getchar();
while(gc<'0'||gc>'9') {if(gc=='-')f=-f; gc=getchar();}
while(gc>='0'&&gc<='9') ret=ret*10+gc-'0',gc=getchar();
return ret*f;
}
int main()
{
n=rd(),m=rd();
int i,j;
for(i=0;i<n;i++) pos[i]=rd()-1,T[pos[i]]=i;
for(i=0;i<n;i++) pre[i]=i-1,nxt[i]=(i==n-1)?-1:i+1;
for(i=0;i<m;i++) S[i]=rd();
for(i=n-1;i>=0;i--)
{
p1[i]=(pre[T[i]]==-1)?-1:(i-pos[pre[T[i]]]);
p2[i]=(nxt[T[i]]==-1)?-1:(i-pos[nxt[T[i]]]);
if(nxt[T[i]]!=-1) pre[nxt[T[i]]]=pre[T[i]];
if(pre[T[i]]!=-1) nxt[pre[T[i]]]=nxt[T[i]];
}
i=0,j=-1,next[0]=-1;
while(i<n)
{
if(j==-1||((p1[j]==-1||T[i-p1[j]]<T[i])&&(p2[j]==-1||T[i-p2[j]]>T[i]))) next[++i]=++j;
else j=next[j];
}
i=j=0;
while(i<m)
{
if(j==-1||((p1[j]==-1||S[i-p1[j]]<S[i])&&(p2[j]==-1||S[i-p2[j]]>S[i]))) i++,j++;
else j=next[j];
if(j==n)
{
ans[++ans[0]]=i-n+1,j=next[j];
}
}
printf("%d\n",ans[0]);
for(i=1;i<=ans[0];i++) printf("%d%c",ans[i],i==ans[0]?'\n':' ');
return 0;
}

【BZOJ2384】[Ceoi2011]Match KMP的更多相关文章

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

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

  2. 【BZOJ3670】动物园(KMP算法)

    [BZOJ3670]动物园(KMP算法) 题面 BZOJ 题解 神TM阅读理解题 看完题目之后 想暴力: 搞个倍增数组来跳\(next\) 每次暴跳\(next\) 复杂度\(O(Tnlogn)\) ...

  3. 【BZOJ3670】【NOI2014】动物园(KMP算法)

    [BZOJ3670]动物园(KMP算法) 题面 BZOJ 题解 神TM阅读理解题 看完题目之后 想暴力: 搞个倍增数组来跳\(next\) 每次暴跳\(next\) 复杂度\(O(Tnlogn)\) ...

  4. 【HDU3081】Marriage Match II (二分+最大流)

    Description Presumably, you all have known the question of stable marriage match. A girl will choose ...

  5. UOJ #5. 【NOI2014】动物园 扩大KMP

    第一次NOI称号. ... 扩展假设知道KMP如果. .. . 就是水题了. ... #5. [NOI2014]动物园 统计提交情况 描写叙述 提交 近日.园长发现动物园中好吃懒做的动物越来越多了.比 ...

  6. 【BZOJ4641】基因改造 KMP

    [BZOJ4641]基因改造 Description "人类智慧的冰峰,只有萌萌哒的我寂寞地守望." --TB TB正走在改造人类智慧基因的路上.TB发现人类智慧基因一点也不萌萌哒 ...

  7. 【BZOJ4974】字符串大师 KMP

    [BZOJ4974]字符串大师 Description 一个串T是S的循环节,当且仅当存在正整数k,使得S是T^k(即T重复k次)的前缀,比如abcd是abcdabcdab的循环节.给定一个长度为n的 ...

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

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

  9. 【BZOJ-1009】GT考试 KMP+DP+矩阵乘法+快速幂

    1009: [HNOI2008]GT考试 Time Limit: 1 Sec  Memory Limit: 162 MBSubmit: 2745  Solved: 1694[Submit][Statu ...

随机推荐

  1. 一个简单的JS函数,用于判断文本是否数字

    /****************************************************** 判断是否是数字(整数,小数均可,不包括负数)* 2014年10月10日22:38:19* ...

  2. 倍福TwinCAT(贝福Beckhoff)常见问题(FAQ)-如何获取标准驱动器扭矩值获取电流值

    双击某个驱动器(以松下伺服驱动器为例),在Process Data中,注意默认显示了PDO mapping1的数据(Error code, status word等)   注意左侧,2和3分别表示了与 ...

  3. iOS Core ML与Vision初识

    代码地址如下:http://www.demodashi.com/demo/11715.html 教之道 贵以专 昔孟母 择邻处 子不学 断机杼 随着苹果新品iPhone x的发布,正式版iOS 11也 ...

  4. 基于iOS 10、realm封装的下载器

    代码地址如下:http://www.demodashi.com/demo/11653.html 概要 在决定自己封装一个下载器前,我本以为没有那么复杂,可在实际开发过程中困难重重,再加上iOS10和X ...

  5. Java代码Bug分析插件 FindBugs

    http://www.oschina.net/p/findbugs FindBugs是一个能静态分析源代码中可能会出现Bug的Eclipse插件工具.

  6. Codeforces 476C Dreamoon and Sums (水

    题目链接:点击打开链接 题意: 给定a,b 对于一个数x.若x是nice number,则满足(x/b)/(x%b) == [1,a](即结果在1-a之间) 问: 输出一个数表示 全部nice num ...

  7. ModelSim高级使用进阶_1_do文件和批处理文件使用_Camp

    https://wenku.baidu.com/view/50fb251914791711cc7917fd.html https://wenku.baidu.com/view/73187dcefe47 ...

  8. [容器]docker-ce安装最新版-docker常用操作

    社区: http://www.dockerinfo.net/rancher http://dockone.io/ https://www.kubernetes.org.cn/ 1,docker安装配置 ...

  9. [HNOI2008]玩具装箱toy(dp+斜率优化)

    斜率优化问题一般都是决策单调问题.对于这题能够证明单调决策. 令sum[i]=sigma(c [k] ) 1<=k<=i  ,  f[i]=sum[i]+i ,  c=L+1; 首先我们能 ...

  10. ext2文件系统了解

    一个磁盘可以划分成多个分区,每个分区必须先用格式化工具(例如mkfs命令)格式化成某种格式的文件系统,然后才能存储文件,格式化的过程会在磁盘上写一些管理存储布局的信息.下以ext2文件系统为例说明文件 ...