树状数组+KMP

匹配问题上KMP

但是问题在于如何判断两个位置相等,我们认为如果一个位置之前比他小的数数量相同那么就是相等。

那么我们用树状数组动态维护这个东西,每次跳nxt的时候用树状数组删除数。因为每个数只加入一次,所以复杂度是nlogn的,为什么这样是对的呢?我们这么想,对于当前加入最后的一个字符,这个肯定是对的,如果我们再加入一个数,如果比这个数小,那么影响,否则不影响,现在两个串同时加入两个数,那么如果一个相对大一个相对小,那么这个位置肯定是不匹配的,所以即使影响了之前也没关系。大概是这样吧

#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int N = 1e6 + ;
int n, m;
int a[N], tree[N], s[N], v[N], b[N], c[N], nxt[N], ans[N];
void update(int x, int d)
{
for(; x <= m; x += x & -x) tree[x] += d;
}
int query(int x)
{
int ret = ;
for(; x; x -= x & -x) ret += tree[x];
return ret;
}
int main()
{
scanf("%d%d", &n, &m);
for(int i = ; i <= n; ++i) scanf("%d", &a[i]), s[a[i]] = i;
for(int i = ; i <= n; ++i) v[i] = query(s[i]), update(s[i], );
for(int i = ; i <= m; ++i) scanf("%d", &b[i]), c[i] = b[i];
memset(tree, , sizeof(tree));
for(int i = , j = ; i <= n; ++i)
{
while(query(s[i]) != v[j + ])
{
for(int k = i - j; k < i - nxt[j]; ++k) update(s[k], -);
j = nxt[j];
}
if(query(s[i]) == v[j + ])
{
update(s[i], );
++j;
}
nxt[i] = j;
}
sort(c + , c + m + );
memset(tree, , sizeof(tree));
for(int i = , j = ; i <= m; ++i)
{
b[i] = lower_bound(c + , c + m + , b[i]) - c;
while(j == n || query(b[i]) != v[j + ])
{
for(int k = i - j; k < i - nxt[j]; ++k) update(b[k], -);
j = nxt[j];
}
if(query(b[i]) == v[j + ])
{
++j;
update(b[i], );
}
if(j == n) ans[++ans[]] = i - j + ;
}
printf("%d\n", ans[]);
for(int i = ; i <= ans[]; ++i) printf("%d%c", ans[i], i == ans[] ? '\n' : ' ');
return ;
}

bzoj2384的更多相关文章

  1. 【BZOJ2384】[Ceoi2011]Match KMP

    [BZOJ2384][Ceoi2011]Match Description 作为新一轮广告大战的一部分,格丁尼亚的一家大公司准备在城市的某处设置公司的标志(logo).公司经理决定用一些整栋的建筑来构 ...

  2. BZOJ2384:[CEOI2014]Match

    浅谈\(KMP\):https://www.cnblogs.com/AKMer/p/10438148.html 题目传送门:https://lydsy.com/JudgeOnline/problem. ...

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

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

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

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

  5. 【bzoj4641】基因改造 特殊匹配条件的KMP

    题目描述 如果两个长度相等的字符串,如果存在一种字符的一一映射,使得第一个字符串的所有字符经过映射后与第二个字符串相同,那么就称它们“匹配”.现在给出两个串,求第一个字符串所有长度等于第二个字符串的长 ...

随机推荐

  1. HBase总结

    1.HBase是一个分布式的.面向列的开源数据库,该技术来源于 Fay Chang 所撰写的Google论文“Bigtable:一个结构化数据的分布式存储系统”.就像Bigtable利用了Google ...

  2. 使用Swagger生成Spring Boot REST客户端(支持Feign)(待实践)

    如果项目上使用了Swagger做RESTful的文档,那么也可以通过Swagger提供的代码生成器生成客户端代码,同时支持Feign客户端. 但是经过测试,生成Feign代码和REST客户端有些臃肿. ...

  3. iOS 合并.a文件,制作通用静态库

    lipo  -create  SQY/iOS/iphoneos/libGamePlusAPI.a  SQY/iOS/iphonesimulator/libGamePlusAPI.a  - output ...

  4. 用Perl发送邮件小例子

    据传,Perl发送邮件有很多方案,但我只会用Mail::Sender这种方式,也就只能简单谈谈这种方式. 在参考众多网页后,程序书写如下: #!/usr/bin/perl -w use Mail::S ...

  5. svn 创建分支、切换分支 及 合并分支 操作

    关联远程仓库: 右键  ---  点击 ' SVN Checkout...' 生成 打开trunk目录,在trunk目录下新建两个文本文件A.java,B.java: 打开A.java输入以下内容: ...

  6. Android中怎样自己制作su

    本文原博客:http://hubingforever.blog.163.com/blog/static/171040579201372915716149/ 在Android源代码的system\ext ...

  7. 【转载】一分钟了解两阶段提交2PC(运营MM也懂了)

    上一期分享了"一分钟了解mongoDB"[回复"mongo"阅读],本期将分享分布式事务的一种实现方式2PC. 一.概念 二阶段提交2PC(Two phase ...

  8. SQLDMO注冊

    在维护人事系统时.师姐给我们提出一个功能上有问题. 备份数据库时.报黄页.然后须要我们寻找原因,作出解决方式. 一開始我从原先在本机上公布的系统入手,发现没有出现故障.可是.当对程序进行调试时,就出现 ...

  9. 笔记整理--LibCurl开发

    LibCurl开发_未了的雨_百度空间 - Google Chrome (2013/7/26 21:11:15) LibCurl开发 一:LibCurl 编程流程1.调用curl_global_ini ...

  10. NIO原理图