树状数组+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 ;
}

最新文章

  1. MVVM下listbox默认显示最后一行
  2. 获取URL中的参数
  3. 调试 rewrite
  4. hdwiki model目录下的函数类
  5. P142-1
  6. [转]StringUtils方法
  7. purge
  8. [ahu 1248] NBA Finals
  9. LDAP索引及缓存优化
  10. Android学习之DragEvent
  11. JavaScript 中的this指向问题
  12. 1615: [Usaco2008 Mar]The Loathesome Hay Baler麻烦的干草打包机
  13. Android 性能测试之方向与框架篇
  14. SVN客户端和服务器端下载地址
  15. SimpleDateFormat安全的时间格式化
  16. Callable抛出异常与future.get
  17. 数值计算 的bug:(理论)数学上等价,实际运行未必等价
  18. MYSQLi数据访问修改数据
  19. vue初学实践之路——vue简单日历组件(3)
  20. 【BZOJ1862】[ZJOI2006]游戏排名系统 (Splay)

热门文章

  1. dropwatch 网络协议栈丢包检查利器 与 火丁笔记
  2. VC++下编译Libgeotiff(含Libtiff)
  3. FIREDAC字段类型映射
  4. influxdb的python操作
  5. Java线程池 ExecutorService
  6. Autolayout和VFL
  7. Effective C++ 条款13/14 以对象管理资源 || 在资源管理类中小心拷贝行为
  8. 分析Cocos2d-x横版ACT手游源码 1、公共
  9. java开始到熟悉60
  10. TestNG – Run multiple test classes (suite test)