【LOJ#2507】[CEOI2011]Matching(KMP,树状数组)
【LOJ#2507】[CEOI2011]Matching(KMP,树状数组)
题面
题解
发现要做的是排名串的匹配。
然后我们考虑把它转成这个位置之前有多少个数小于当前这个数,这样子只要每个位置都对应相等那么一定是合法的。
然后就可以类似\(KMP\)的预处理出一个\(nxt\)数组,然后再类似\(KMP\)的匹配。
因为需要支持动态求前面一段区间有多少个数比这个数小,所以需要用\(BIT\)维护。
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<vector>
using namespace std;
#define ll long long
#define MAX 1000100
inline int read()
{
int x=0;bool t=false;char ch=getchar();
while((ch<'0'||ch>'9')&&ch!='-')ch=getchar();
if(ch=='-')t=true,ch=getchar();
while(ch<='9'&&ch>='0')x=x*10+ch-48,ch=getchar();
return t?-x:x;
}
vector<int> Ans;
int c[MAX],N,n,m,a[MAX],S[MAX],p[MAX],nt[MAX],rk[MAX];
int lb(int x){return x&(-x);}
void Add(int x,int w){while(x<=N)c[x]+=w,x+=lb(x);}
int getsum(int x){int s=0;while(x)s+=c[x],x-=lb(x);return s;}
int main()
{
n=read();m=read();N=n;
for(int i=1;i<=n;++i)p[read()]=i;
for(int i=1;i<=m;++i)S[i]=a[i]=read();
sort(&S[1],&S[m+1]);
for(int i=1;i<=m;++i)a[i]=lower_bound(&S[1],&S[m+1],a[i])-S;
for(int i=1;i<=n;++i)Add(p[i],1),rk[i]=getsum(p[i]);
memset(c,0,sizeof(c));
nt[0]=nt[1]=0;
for(int i=2,lst=2;i<=n;++i)
{
int t=nt[i-1];
while(t&&getsum(p[i])+1!=rk[t+1])
{
int v=nt[t];
while(lst<i-v)Add(p[lst++],-1);
t=v;
}
if(getsum(p[i])+1==rk[t+1])++t;
nt[i]=t;Add(p[i],1);
}
memset(c,0,sizeof(c));N=m;
for(int i=1,j=0,lst=1;i<=m;++i)
{
while(j&&getsum(a[i])+1!=rk[j+1])
{
int v=nt[j];
while(lst<i-v)Add(a[lst++],-1);
j=v;
}
if(getsum(a[i])+1==rk[j+1])++j;
if(j==n)
{
Ans.push_back(i-n+1);int v=nt[j];
while(lst<i-v+1)Add(a[lst++],-1);
j=v;
}
Add(a[i],1);
}
printf("%d\n",(int)Ans.size());
for(int v:Ans)printf("%d ",v);puts("");
return 0;
}
【LOJ#2507】[CEOI2011]Matching(KMP,树状数组)的更多相关文章
- luoguP4696 [CEOI2011]Matching KMP+树状数组
可以非常轻易的将题意转化为有多少子串满足排名相同 注意到$KMP$算法只会在当前字符串的某尾添加和删除字符 因此,如果添加和删除后面的字符对于前面的字符没有影响时,我们可以用$KMP$来模糊匹配 对于 ...
- 【bzoj2384】[Ceoi2011]Match 特殊匹配条件的KMP+树状数组
题目描述 给出两个长度分别为n.m的序列A.B,求出B的所有长度为n的连续子序列(子串),满足:序列中第i小的数在序列的Ai位置. 输入 第一行包含两个整数n, m (2≤n≤m≤1000000). ...
- 【POJ 3167】Cow Patterns (KMP+树状数组)
Cow Patterns Description A particular subgroup of K (1 <= K <= 25,000) of Farmer John's cows l ...
- 【未完】训练赛20190304:KMP+树状数组+线段树+优先队列
头炸了啊,只做出L题,前两天刚看的Shawn zhou的博客学习的,幸亏看了啊,否则就爆零了,发现题目都是经典题,线段树,KMP,我都没看过,最近又在复习考研,真后悔大一大二没好好学习啊,得抽时间好好 ...
- 【poj 3167】Cow Patterns(字符串--KMP匹配+数据结构--树状数组)
题意:给2个数字序列 a 和 b ,问按从小到达排序后,a中的哪些子串与b的名次匹配. a 的长度 N≤100,000,b的长度 M≤25,000,数字的大小 K≤25. 解法:[思考]1.X 暴力. ...
- [bzoj1892][bzoj2384][bzoj1461][Ceoi2011]Match/字符串的匹配_KMP_树状数组
2384: [Ceoi2011]Match 1892: Match 1461: 字符串的匹配 题目大意: 数据范围: 题解: 很巧妙的一道题呀. 需要对$KMP$算法有很深的理解才行. 首先我们需要发 ...
- 51nod 1286 三段子串(树状数组+拓展kmp)
题意: 给定一个字符串S,找到另外一个字符串T,T既是S的前缀,也是S的后缀,并且在中间某个地方也出现一次,并且这三次出现不重合.求T最长的长度. 例如:S = "abababababa&q ...
- 「模拟赛20180306」回忆树 memory LCA+KMP+AC自动机+树状数组
题目描述 回忆树是一棵树,树边上有小写字母. 一次回忆是这样的:你想起过往,触及心底--唔,不对,我们要说题目. 这题中我们认为回忆是这样的:给定 \(2\) 个点 \(u,v\) (\(u\) 可能 ...
- [APIO2019] [LOJ 3146] 路灯 (cdq分治或树状数组套线段树)
[APIO2019] [LOJ 3146] 路灯 (cdq分治或树状数组套线段树) 题面 略 分析 首先把一组询问(x,y)看成二维平面上的一个点,我们想办法用数据结构维护这个二维平面(注意根据题意这 ...
随机推荐
- [译]Vulkan教程(07)物理设备和队列家族
[译]Vulkan教程(07)物理设备和队列家族 Selecting a physical device 选择一个物理设备 After initializing the Vulkan library ...
- Hive 报错 Error while compiling statement: FAILED: ParseException line 1:0 character '' not supported here (state=42000,code=40000)
Hive报错 Error while compiling statement: FAILED: ParseException line 1:0 character '' not supported h ...
- Springboot对SpringMVC如何扩展配置
原文地址:http://www.javayihao.top/detail/171 概述 Springboot在web层的开发基本都是采用Springmvc框架技术,但是Springmvc中的某些配置在 ...
- 多线程七 AQS
一 . 简介AQS AQS简介 在同步组件的实现中,AQS是核心部分,同步组件的实现者,通过使用AQS提供的模板方法 实现同步组件语义 AQS实现了对同步状态的管理以及阻塞线程进行排队,等待通知等等一 ...
- 基于STM32F429的ADS1115驱动程序
1.ADS1115中文资料:https://wenku.baidu.com/view/8bab101feef9aef8941ea76e58fafab069dc44e7.html?rec_flag=de ...
- [Spring cloud 一步步实现广告系统] 4. 通用代码模块设计
一个大的系统,在代码的复用肯定是必不可少的,它能解决: 统一的响应处理(可以对外提供统一的响应对象包装) 统一的异常处理(可以将业务异常统一收集处理) 通用代码定义.配置定义(通用的配置信息放在统一的 ...
- C# 动态加载资源
在xaml中控件通过绑定静态资源StaticResource来获取样式Style有多种方式,TextBlockStyle.xaml是一个ResourceDictionary,包含了所需样式 通过相对路 ...
- netcore3.0使用Session
首先需要明确一点,netcore使用session不能直接使用,必须引用nuget包并做注册之后才能使用. 例如下面的例子,若未注册session服务会报 HttpContext.Session.Se ...
- .netcore2.1 JS-SDK 从后台获取微信签名,实现自定义分享标题、描述、图片
最近项目移动端需要实现微信自定义分享功能,包含分享自定义标题.描述等. 首先到公众号的后台,功能设置里面,添加将要被分享的域名,如图 后端签名算法实现 ,参考腾讯开发者文档https://mp.wei ...
- 7.智能快递柜(APP及微信公众号)
1.智能快递柜(开篇) 2.智能快递柜(终端篇) 3.智能快递柜(通信篇-HTTP) 4.智能快递柜(通信篇-SOCKET) 5.智能快递柜(通信篇-Server程序) 6.智能快递柜(平台篇) 7. ...