什么字符串。。。明明是两个数列。。。

分类上来讲,还是一道很好的noip题。。。(雾)

首先,kmp会不会?(答:会!)

其次,树状数组求顺序对会不会?(再答:会!)

讲完了!>.<

进入正题:

首先,要知道kmp匹配是O(m + n)的原因,是因为匹配每一位的时间是O(1)的。。。

而我们这里是一个数列,每一位需要搞出一个特征值,使得特征值相同 <=> 可以匹配这一位

于是就想到了以这一位为末位的当前已匹配区间内的动态顺序对的数目,而求这个东西是O(n * log n)的

故总复杂度O(m * log m + n * log n)

 /**************************************************************
Problem: 1461
User: rausen
Language: C++
Result: Accepted
Time:644 ms
Memory:12564 kb
****************************************************************/ #include <cstdio>
#include <cstring> #define lowbit(x) x & -x
using namespace std;
const int S = ;
const int N = ;
int a[N], b[N], les[N], equ[N], next[N], ans[N];
int BIT[S];
int n, m, s, tot; inline int read(){
int x = , sgn = ;
char ch = getchar();
while (ch < '' || ch > ''){
if (ch == '-') sgn = -;
ch = getchar();
}
while (ch >= '' && ch <= ''){
x = x * + ch - '';
ch = getchar();
}
return sgn * x;
} inline void add(int x, int del){
while (x <= s)
BIT[x] += del, x += lowbit(x);
} inline int query(int x){
int res = ;
while (x)
res += BIT[x], x -= lowbit(x);
return res;
} void get_next(){
memset(BIT, , sizeof(BIT));
next[] = ;
int i = , j = , k;
for (; i <= m; ++i){
add(b[i], );
while (j && (query(b[i] - ) != les[j + ] || query(b[i]) != equ[j + ])){
for (k = i - j; k < i - next[j]; ++k)
add(b[k], -);
j = next[j];
}
next[i] = ++j;
}
} void kmp(){
memset(BIT, , sizeof(BIT));
int i = , j = , k, res = ;
for (; i <= n; ++i){
add(a[i], );
while (j && (query(a[i] - ) != les[j + ] || query(a[i]) != equ[j + ])){
for (k = i - j; k < i - next[j]; ++k)
add(a[k], -);
j = next[j];
}
if (j == m - ){
ans[++tot] = i - j;
for (k = i - j; k < i - next[j]; ++k)
add(a[k], -);
j = next[j];
}
++j;
}
} int main(){
int i;
n = read(), m = read(), s = read();
for (i = ; i <= n; ++i)
a[i] = read();
for (i = ; i <= m; ++i)
b[i] = read();
memset(BIT, , sizeof(BIT));
for (i = ; i <= m; ++i){
add(b[i], );
les[i] = query(b[i] - );
equ[i] = query(b[i]);
}
get_next();
kmp();
printf("%d\n", tot);
for (i = ; i <= tot; ++i)
printf("%d\n", ans[i]);
return ;
}

(p.s. 如有不懂请Orz此巨巨)

BZOJ1461 字符串的匹配的更多相关文章

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

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

  2. Oracle添加数据报文字与格式字符串不匹配错误

    今天在学习Oracle时碰到一个错:文字与格式字符串不匹配. 我在Oracle数据库中创建了一张表: --创建员工表employee create table employee ( empon ) n ...

  3. oracle文字与格式字符串不匹配的解决

    oracle文字与格式字符串不匹配的解决 oracle的日期时间类型 在往oracle的date类型插入数据的时候,记得要用to_date()方法. 如insert into CUSLOGS(STAR ...

  4. 带’*’号字符串的匹配

    目标: 判断源字符串中是否含有指定子串,子串可能会有*号通配符. 初步测试没问题.记录下来.后面要是有问题再来纠正. #include <string> using namespace s ...

  5. Java字符串的匹配问题,String类的matches方法与Matcher类的matches方法的使用比较,Matcher类的matches()、find()和lookingAt()方法的使用比较

    参考网上相关blog,对Java字符串的匹配问题进行了简单的比较和总结,主要对String类的matches方法与Matcher类的matches方法进行了比较. 对Matcher类的matches( ...

  6. java.sql.SQLException:ORA-01861:文字和格式字符串不匹配

    1.错误描述 java.sql.SQLException:ORA-01861:文字和格式字符串不匹配 2.错误原因 字段名为statis_date在数据库中存储的数据类型是Date,而在Java中拼接 ...

  7. 异常-----java.sql.SQLException:ORA-01861:文字和格式字符串不匹配

    1.错误描述 java.sql.SQLException:ORA-01861:文字和格式字符串不匹配 2.错误原因 字段名为statis_date在数据库中存储的数据类型是Date,而在Java中拼接 ...

  8. Oracle 插入时间时 报错:ORA-01861: 文字与格式字符串不匹配 的解决办法

    一.写sql的方式插入到Oracle中 往oracle中插入时间  '2007-12-28 10:07:24'如果直接按照字符串方式,或者,直接使用to_date('2007-12-28 10:07: ...

  9. C++实现的字符串模糊匹配

    C++基本没有正则表达式功能,当然像Boost里提供了正则.本文来源于博客园园友的一篇文章,请看: C/C++ 字符串模糊匹配 很早之前就看过这篇文章,原作者的需求很明确.代码实现也很好. 之所以又写 ...

随机推荐

  1. 20145106 《Java程序设计》第9周学习总结

    教材学习内容总结 JDBC标准主要分为两个部分:JDBC应用程序开发者接口以及JDBC驱动程序开发者接口. 如果将来要换为Oracle数据库,只要置换Oracle驱动程序. Java中的数据类型和SQ ...

  2. STM32.定时器

    一.定时器分类 11个定时器: 定时器: 1.8  高级(7路PWM输出) 2.3.4.5 通用(4路) 6.7    基本 2个看门狗 1个sysTick 时钟分布: 二.这里我们主要对定时器中 定 ...

  3. SVC(STM32)

    这两个都是 system level service,有什么区别呢?…… 手册上说 SVC 这个指令是同步的,而 PendSV 是异步的,请问是什么意思呢?…… 高手路过尽请留言啊

  4. bzoj 1096 仓库建设 -斜率优化

    L公司有N个工厂,由高到底分布在一座山上.如图所示,工厂1在山顶,工厂N在山脚.由于这座山处于高原内陆地区(干燥少雨),L公司一般把产品直接堆放在露天,以节省费用.突然有一天,L公司的总裁L先生接到气 ...

  5. IDEA中使用.ignore插件忽略不必要提交的文件

    使用的IDE是IntelliJ IDEA,发现IDEA在提交项目到本地仓库的时候,会把.idea文件夹中的内容也提交上去,这里面放的是一些项目的配置信息,包括历史记录,版本控制信息等.可以不传到Git ...

  6. 如何创建自己的python包

    写过python的人都知道python最方便也最牛的地方就是它有无数的第三方lib可以直接拿来使用,可以让编写代码变的更容易. 长用的安装第三方lib的方法有easy_install和pip,这两个的 ...

  7. C++ 清空队列(queue)的几种方法

    C++中的queue自身是不支持clear操作的,但是双端队列deque是支持clear操作的. 方法一 直接用空的队列对象赋值 queue<int> q1; // process // ...

  8. C# 实现简单的 Heap 堆(二叉堆)

    如题,C#  实现简单的二叉堆的 Push() 和 Pop(), 如有不足欢迎指正. 另外,在C#中使用 Heap 的相似功能可以考虑使用:Priority Queues,SortedDictiona ...

  9. 02_Python简单爬虫(熊猫直播LOL的up主,谁最强!)

    声明: 本文仅用于Python练手,并无任何恶意攻击行为! # 导入request模块 from urllib import request # 导入re模块 import re class Spid ...

  10. POJ 2728 Desert King(最优比率生成树 01分数规划)

    http://poj.org/problem?id=2728 题意: 在这么一个图中求一棵生成树,这棵树的单位长度的花费最小是多少? 思路: 最优比率生成树,也就是01分数规划,二分答案即可,题目很简 ...