LOJ2507 CEOI2011 Matching
参考了 神仙yyb的博客
现在发现kmp不仅能匹配字符串,还可以用于处理任意模式匹配中的状态,如这题中已经匹配的序列中的数的大小关系就是一种状态,使用kmp找到模式序列的每一个前缀的border,即一个最长的前缀和后缀使得它们的数字大小关系相同,即匹配状态相同,然后在失配时跳转到一个前缀的状态继续匹配,就可以解决这个问题啦!
代码:
#include<bits/stdc++.h>
using namespace std;
#define N 1000007
int sum[N],n,m;
void modify(int x,int d)
{
for(;x<=m;x+=x&-x)
sum[x]+=d;
}
int query(int x)
{
int ans=;
for(;x;x-=x&-x)
ans+=sum[x];
return ans;
}
int read()
{
char c;
int x;
while((c=getchar())<||c>);
x=c-;
while((c=getchar())>=&&c<=)
x=x*+c-;
return x;
}
int rk[N],nxt[N],a[N],b[N],p[N];
vector<int> ans;
int main()
{
int i;
scanf("%d%d",&n,&m);
for(i=;i<=n;i++)
p[read()]=i;
for(i=;i<=n;i++)
{
modify(p[i],);
rk[i]=query(p[i]);
}
memset(sum,,sizeof(sum));
nxt[]=;
int last=;
for(i=;i<=n;i++)
{
int len=nxt[i-];
while(len&&query(p[i])+!=rk[len+])
{
len=nxt[len];
while(last<i-len)modify(p[last++],-);
}
if(query(p[i])+==rk[len+])
{
nxt[i]=len+;
modify(p[i],);
}
else nxt[i]=;
}
for(i=;i<=m;i++)
a[i]=b[i]=read();
sort(b+,b+m+);
for(i=;i<=m;i++)a[i]=lower_bound(b+,b+m+,a[i])-b;
memset(sum,,sizeof(sum));
int len=;
last=;
for(i=;i<=m;i++)
{
while(len&&query(a[i])+!=rk[len+])
{
len=nxt[len];
while(last<i-len)modify(a[last++],-);
}
if(query(a[i])+==rk[len+])
{
len++;
modify(a[i],);
if(len==n)ans.push_back(i-len+);
}
else len=;
}
int s=ans.size();
printf("%d\n",s);
for(i=;i<s;i++)
printf("%d ",ans[i]);
printf("\n");
return ;
}
LOJ2507 CEOI2011 Matching的更多相关文章
- 【LOJ#2507】[CEOI2011]Matching(KMP,树状数组)
[LOJ#2507][CEOI2011]Matching(KMP,树状数组) 题面 LOJ 题解 发现要做的是排名串的匹配. 然后我们考虑把它转成这个位置之前有多少个数小于当前这个数,这样子只要每个位 ...
- luoguP4696 [CEOI2011]Matching KMP+树状数组
可以非常轻易的将题意转化为有多少子串满足排名相同 注意到$KMP$算法只会在当前字符串的某尾添加和删除字符 因此,如果添加和删除后面的字符对于前面的字符没有影响时,我们可以用$KMP$来模糊匹配 对于 ...
- @loj - 2507@ 「CEOI2011」Matching
目录 @description@ @solution@ @accepted code@ @details@ @description@ 对于整数序列 \((a_1, a_2, ..., a_n)\) ...
- 学习《Hardware-Efficient Bilateral Filtering for Stereo Matching》一文笔记。
个人收藏了很多香港大学.香港科技大学以及香港中文大学里专门搞图像研究一些博士的个人网站,一般会不定期的浏览他们的作品,最近在看杨庆雄的网点时,发现他又写了一篇双边滤波的文章,并且配有源代码,于是下载下 ...
- LeetCode题解-----Wildcard Matching
题目描述: '?' Matches any single character. '*' Matches any sequence of characters (including the empty ...
- cvc-complex-type.2.4.c: The matching wildcard is strict, but no declaration can be found for element 'mvc:annotation-driven'.
spring 配置文件报错报错信息:cvc-complex-type.2.4.c: The matching wildcard is strict, but no declaration can be ...
- [LeetCode] Wildcard Matching 外卡匹配
Implement wildcard pattern matching with support for '?' and '*'. '?' Matches any single character. ...
- [LeetCode] Regular Expression Matching 正则表达式匹配
Implement regular expression matching with support for '.' and '*'. '.' Matches any single character ...
- Beginning Scala study note(5) Pattern Matching
The basic functional cornerstones of Scala: immutable data types, passing of functions as parameters ...
随机推荐
- Mac PyCharm激活/激活码
此教程实时更新,请放心使用:如果有新版本出现猪哥都会第一时间尝试激活: pycharm官网下载地址:http://www.jetbrains.com/pycharm/download/ 激活前准备工作 ...
- Java中接口和Sala中的特质的区别?
1.先要区分是Java中哪个版本的接口,因为Java中不同版本接口是不一样2.Java8之前的接口(不包含Java8),这个版本的接口只能属性和抽象方法,和Scala中的特质有完全的不用因为Scala ...
- 直接操作DOM一定比虚拟DOM操作耗时,diff算法,key值,虚拟 DOM的定义
直接操作DOM一定比虚拟DOM操作耗时吗? 或者一次直接DOM操作一定比一次虚拟DOM操作耗时吗? 1)虚拟DOM的本质就是一个JS对象,虚拟DOM减少了真实DOM的操作,当修改数据的时候,就是修改虚 ...
- http响应总结:常见http响应错误总结
工作中经常会被同事问这个http请求为什么调不通,我虽然能解释清楚错误是什么,但是没有总结过,想到刚开始时,也是看了别人的文章才会的,所以总结一下,贡献一下自己的经验. http 404 响应 404 ...
- Java反射获取泛型类型
本文链接:https://blog.csdn.net/hongxingxiaonan/article/details/49202613 在Java反射技术的应用中,取得一个类的成员.方法和构造函数相对 ...
- 使用Docker之镜像的拉取、查询、删除
1:查看镜像列表 2:拉取镜像 通过命令可以从镜像仓库中拉取镜像,默认从Docker Hub 获取. 命令格式: docker image pull <repository>:< ...
- tkinter的trace()变动追踪
tkinter的trace() 的参数w是写入追踪 from tkinter import * def callback(*args): xl.set(xE.get()) print("改变 ...
- css3+JS实现幻灯片轮播图
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...
- 英语CollaCoriiAsini阿胶CollaCoriiAsini单词
阿胶(colla Corii Asini)始载于<神农本草经>,是马科动物驴的皮去毛后熬制而成的胶块,其性味甘.平,具有滋阴润肺,补血.止血等功效.主要治疗血虚萎黄,眩晕心悸,肌痿无力,心 ...
- 一些你所不知道的VS Code插件
摘要: 你所不知道的系列. 原文:提高 JavaScript 开发效率的高级 VSCode 扩展之二! 作者:前端小智 Fundebug经授权转载,版权归原作者所有. 作为一名业余爱好者.专业人员,甚 ...