【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)看成二维平面上的一个点,我们想办法用数据结构维护这个二维平面(注意根据题意这 ...
随机推荐
- 54. Spiral Matrix && 59. Spiral Matrix II
Given a positive integer n, generate a square matrix filled with elements from 1 to n2 in spiral ord ...
- java 主动信任证书
java 主动信任证书 SSLContext sslcontext = SSLContexts.custom().loadKeyMaterial(keyStore, mid.toCharArray() ...
- poi创建excel文件
package com.mozq.sb.file01.test; import org.apache.poi.hssf.usermodel.*; import org.apache.poi.hssf. ...
- SpringCloud gateway (史上最全)
疯狂创客圈 Java 分布式聊天室[ 亿级流量]实战系列之 -25[ 博客园 总入口 ] 前言 ### 前言 疯狂创客圈(笔者尼恩创建的高并发研习社群)Springcloud 高并发系列文章,将为大家 ...
- Latex学习与使用
Table of Contents Latex学习与使用 简介 文档结构 排版 表格 图片 公式 索引 简介 Latex(发音lay-tek)是一个用来产生专业文档的系统,但它并不是一个单词处理器.它 ...
- nlohmann 最优秀的C++序列化工具库 详细入门教程
本文首发于个人博客https://kezunlin.me/post/f3c3eb8/,欢迎阅读最新内容! tutorial to use nlohmann json for serializing d ...
- 当面试官要你介绍一下MQ时,该怎么回答?
一.为什么要使用MQ消息中间件? 一个用消息队列的人,不知道为啥用,有点尴尬.没有复习这点,很容易被问蒙,然后就开始胡扯了. 回答:这个问题,咱只答三个最主要的应用场景,不可否认还有其他的,但是只答三 ...
- 记录一次netcore3.0 code first使用迁移命令报错问题
环境描述:macOS .vscode .netcore3.0 迁移工具:Microsoft.EntityFrameworkCore.Tools 遇到的问题: Could not execute bec ...
- WGS84、WebMercator、GCJ02和BD09坐标系简介与转换
WGS84(GPS): 地心坐标系,空间直角坐标系,原点与地球质心重合,为GPS采用的坐标系,也是目前广泛使用的GPS全球卫星定位系统使用的坐标系. 通过GPS可以直接获取WGS84下的坐标(B,L, ...
- Google Admob移动广告快速集成步骤
Google Admob移动广告快速集成步骤 第一步:引入依赖包 //admob广告 implementation 'com.google.android.gms:play-services-ads: ...