BZOJ1461 字符串的匹配
什么字符串。。。明明是两个数列。。。
分类上来讲,还是一道很好的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 字符串的匹配的更多相关文章
- [bzoj1892][bzoj2384][bzoj1461][Ceoi2011]Match/字符串的匹配_KMP_树状数组
2384: [Ceoi2011]Match 1892: Match 1461: 字符串的匹配 题目大意: 数据范围: 题解: 很巧妙的一道题呀. 需要对$KMP$算法有很深的理解才行. 首先我们需要发 ...
- Oracle添加数据报文字与格式字符串不匹配错误
今天在学习Oracle时碰到一个错:文字与格式字符串不匹配. 我在Oracle数据库中创建了一张表: --创建员工表employee create table employee ( empon ) n ...
- oracle文字与格式字符串不匹配的解决
oracle文字与格式字符串不匹配的解决 oracle的日期时间类型 在往oracle的date类型插入数据的时候,记得要用to_date()方法. 如insert into CUSLOGS(STAR ...
- 带’*’号字符串的匹配
目标: 判断源字符串中是否含有指定子串,子串可能会有*号通配符. 初步测试没问题.记录下来.后面要是有问题再来纠正. #include <string> using namespace s ...
- Java字符串的匹配问题,String类的matches方法与Matcher类的matches方法的使用比较,Matcher类的matches()、find()和lookingAt()方法的使用比较
参考网上相关blog,对Java字符串的匹配问题进行了简单的比较和总结,主要对String类的matches方法与Matcher类的matches方法进行了比较. 对Matcher类的matches( ...
- java.sql.SQLException:ORA-01861:文字和格式字符串不匹配
1.错误描述 java.sql.SQLException:ORA-01861:文字和格式字符串不匹配 2.错误原因 字段名为statis_date在数据库中存储的数据类型是Date,而在Java中拼接 ...
- 异常-----java.sql.SQLException:ORA-01861:文字和格式字符串不匹配
1.错误描述 java.sql.SQLException:ORA-01861:文字和格式字符串不匹配 2.错误原因 字段名为statis_date在数据库中存储的数据类型是Date,而在Java中拼接 ...
- Oracle 插入时间时 报错:ORA-01861: 文字与格式字符串不匹配 的解决办法
一.写sql的方式插入到Oracle中 往oracle中插入时间 '2007-12-28 10:07:24'如果直接按照字符串方式,或者,直接使用to_date('2007-12-28 10:07: ...
- C++实现的字符串模糊匹配
C++基本没有正则表达式功能,当然像Boost里提供了正则.本文来源于博客园园友的一篇文章,请看: C/C++ 字符串模糊匹配 很早之前就看过这篇文章,原作者的需求很明确.代码实现也很好. 之所以又写 ...
随机推荐
- tensorflow reduction_indices理解
在tensorflow的使用中,经常会使用tf.reduce_mean,tf.reduce_sum等函数,在函数中,有一个reduction_indices参数,表示函数的处理维度,直接上图,一目了然 ...
- 在Windows下搭建Android开发环境及遇到的问题
转载1:http://www.cnblogs.com/xdp-gacl/p/4322165.html 转载2:http://www.cnblogs.com/zoupeiyang/p/4034517.h ...
- Go第三篇之大话容器
Go语言数组 数组(Array)是一段固定长度的连续内存区域 在 Go 语言中,数组从声明时就确定,使用时可以修改数组成员,但是数组大小不可变化 Go 语言数组的声明 数组的写法如下: var 数组变 ...
- nmap参数思维导图
链接:https://pan.baidu.com/s/1vD0A6olQbVNmCCirpHBm0w 提取码:o994
- CodeCombat多人游戏Greed
题目的意思在于,更高效的Collect Gold:然后合理的安排生产出来的士兵: // This code runs once per frame. Build units and command p ...
- 【镜像地址】Maven地址列表
1.国内OSChina提供的镜像,非常不错 <mirror> <id>CN</id> <name>OSChina Central</name> ...
- 文件查找:locate、find
文件查找:在文件系统上查找符合条件的文件: locate, find 非实时查找(数据库查找):locate //不是遍历系统文件,把当前系统目录下的所有文件抽取出来制作成一个索引(或者叫数据库), ...
- LA 3213 古老的密码
https://icpcarchive.ecs.baylor.edu/index.php?option=com_onlinejudge&Itemid=8&category=15& ...
- 读书笔记:Spring boot实战
第一章 入门 Spring boot最重要的四个核心 : 1.自动配置:针对很多spring应用程序常见的应用功能,spring boot能自动提供相关配置 2.起步依赖:告诉spring boot需 ...
- 常见文档一览表 -httpclient
httpclient http://www.yeetrack.com/?p=779 虫师『性能测试』文章大汇总 https://www.cnblogs.com/fnng/archive/2012/08 ...