luoguP4696 [CEOI2011]Matching KMP+树状数组

可以非常轻易的将题意转化为有多少子串满足排名相同
注意到$KMP$算法只会在当前字符串的某尾添加和删除字符
因此,如果添加和删除后面的字符对于前面的字符没有影响时,我们可以用$KMP$来模糊匹配
对于本题而言,在末尾插入一个字符时,如果$S$串和$T$串中这两个字符的排名一样,那么它们对前面的影响也是一样的
因此,插入或者删除字符时,后面的字符如果排名一样,可以任何对前面没有影响
反之,如果不一样,那么无法匹配
所以,这满足模糊匹配的条件
我们可以拿树状数组来维护插入和删除
由于$next[i] \leq next[i - 1] + 1$,因此分析一下复杂度不会超过$O(n \log n)$
好像带了大常数......
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
namespace remoon {
#define ri register int
#define rep(iu, st, ed) for(ri iu = st; iu <= ed; iu ++)
#define drep(iu, ed, st) for(ri iu = ed; iu >= st; iu --)
#define gc getchar
inline int read() {
int p = , w = ; char c = gc();
while(c > '' || c < '') { if(c == '-') w = -; c = gc(); }
while(c >= '' && c <= '') p = p * + c - '', c = gc();
return p * w;
}
}
using namespace std;
using namespace remoon; const int sid = ; int n, m, cm, tot;
int ans[sid], nxt[sid], pre[sid];
int t[sid], p[sid], h[sid], T[sid]; inline void upd(int o, int v) {
for(ri i = o; i <= m; i += i & (-i))
t[i] += v;
} inline int qry(int o) {
int ret = ;
for(ri i = o; i; i -= i & (-i))
ret += t[i];
return ret;
} void Solve() {
rep(i, , n)
pre[i] = qry(p[i]), upd(p[i], );
pre[n + ] = -; rep(i, , m) t[i] = ;
for(ri i = , j = ; i <= n; i ++)
{
while(j && qry(p[i]) != pre[j + ])
{
for(ri k = i - j; k < i - nxt[j]; k ++)
upd(p[k], -);
j = nxt[j];
}
if(qry(p[i]) == pre[j + ]) j ++, upd(p[i], );
nxt[i] = j;
} rep(i, , m) t[i] = ;
for(ri i = , j = ; i <= m; i ++)
{
while(j && qry(h[i]) != pre[j + ])
{
for(ri k = i - j; k < i - nxt[j]; k ++)
upd(h[k], -);
j = nxt[j];
}
if(qry(h[i]) == pre[j + ]) j ++, upd(h[i], );
if(j == n) ans[++ tot] = i - n + ;
}
} int main() { n = read(); m = read();
rep(i, , n) p[read()] = i;
rep(i, , m) T[i] = h[i] = read(); sort(T + , T + m + );
cm = unique(T + , T + m + ) - T - ;
rep(i, , m) h[i] = lower_bound(T + , T + cm + , h[i]) - T; Solve();
printf("%d\n", tot);
rep(i, , tot) printf("%d ", ans[i]);
printf("\n");
return ;
}
luoguP4696 [CEOI2011]Matching 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 暴力. ...
- 【LOJ#2507】[CEOI2011]Matching(KMP,树状数组)
[LOJ#2507][CEOI2011]Matching(KMP,树状数组) 题面 LOJ 题解 发现要做的是排名串的匹配. 然后我们考虑把它转成这个位置之前有多少个数小于当前这个数,这样子只要每个位 ...
- [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\) 可能 ...
- 【AC自动机】【树状数组】【dfs序】洛谷 P2414 [NOI2011]阿狸的打字机 题解
这一题是对AC自动机的充分理解和树dfs序的巧妙运用. 题目背景 阿狸喜欢收藏各种稀奇古怪的东西,最近他淘到一台老式的打字机. 题目描述 打字机上只有28个按键,分别印有26个小写英文字母和' ...
随机推荐
- php的几个实用正则表达式
更多内容推荐微信公众号,欢迎关注: 此文章是网上搜索而来: 对于开发人员来说,正则表达式是一个非常有用的功能,它提供了 查找,匹配,替换 句子,单词,或者其他格式的字符串.这篇文章主要介绍了15个超实 ...
- 【多视图几何】TUM 课程 第2章 刚体运动
课程的 YouTube 地址为:https://www.youtube.com/playlist?list=PLTBdjV_4f-EJn6udZ34tht9EVIW7lbeo4 .视频评论区可以找到课 ...
- 20165230 《Java程序设计》实验四 Android程序设计实验报告
20165230 <Java程序设计>实验四 Android程序设计实验报告 一.实验报告封面 课程:Java程序设计 班级:1652班 姓名:田坤烨 学号:20165230 成绩: 指导 ...
- 【bzoj题解】1012 最大数
题目描述 现在请求你维护一个数列,要求提供以下两种操作:1.查询操作.语法:Q L 功能:查询当前数列中末尾L个数中的最大的数,并输出这个数的值.限制:L不超过当前数列的长度.2.插入操作.语法:A ...
- CentOS时区GMT修改为CST
GMT:格林尼标准时间 北京时间=GMT时间+8小时 [root@sa~]# date -R 查看目前服务器的时间标准 [root@sa~]# vi /etc/sysconfig/clock 将ZON ...
- java浅复制与深手动构造实现
首先来看看浅拷贝和深拷贝的定义: 浅拷贝:使用一个已知实例对新创建实例的成员变量逐个赋值,这个方式被称为浅拷贝. 深拷贝:当一个类的拷贝构造方法,不仅要复制对象的所有非引用成员变量值,还要为引用类型的 ...
- robotframework-ride多次运行,有时候不显示日志信息
解决方法: 修改"C:\Python27\lib\site-packages\robotide\contrib\testrunner\testrunner.py"文件pop方法中 ...
- OpenCV与Python之图像的读入与显示以及利用Numpy的图像转换
1:读入图像,显示图像与保存图像 代码: import cv2 img=cv2.imread('lena.jpg',cv2.IMREAD_COLOR) cv2.namedWindow('lena',c ...
- linux用户操作
1.用户种类 Linux具有三种用户: 超级管理员root:具有最高权限,UID=0 GID=0伪用户(System Account):(UID=1~499)普通用户(login-Account): ...
- MIT6.006Lec03:插入排序,归并排序,递归树
MIT6.006是算法导论课,Lec03主要讲插入排序,归并排序,以及分析方法(递归树)等. 插入排序,可以分为线性插入排序.二分插入排序,区别在于当把数组中某元素插入到前面的有序列表中时,前者遍历, ...