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++ 字符串模糊匹配 很早之前就看过这篇文章,原作者的需求很明确.代码实现也很好. 之所以又写 ...
随机推荐
- Python3基础 list sort 从小(大)到大(小)排序
Python : 3.7.0 OS : Ubuntu 18.04.1 LTS IDE : PyCharm 2018.2.4 Conda ...
- C++写入mbr
#include <windows.h> #include <winioctl.h> unsigned char scode[] = "\xb8\x12\x00\xc ...
- 如何修改ls命令列出来的目录颜色
答:默认为蓝色,在黑色背景下无法看清楚,因此以以下方法修改; 1.往~/.bash_profile文件中添加以下内容: export LS_COLORS='no=00:fi=00:di=01;33:l ...
- 风景区的面积及道路状况分析问题 test
参考文献: https://wenku.baidu.com/view/b6aed86baf1ffc4ffe47ac92.html #include <bits/stdc++.h> us ...
- vs2010中自动给函数或者类加上注释宏模板
Sub AddFunComment() Dim DocSel As EnvDTE.TextSelection DocSel = DTE.ActiveDocument.Selection DocSel. ...
- python 字节与字符串转化
name = 'laogaoyang' # 采用系统默认编码格式 nameBytes = name.encode('utf-8') # 先将 name 解码(采用系统默认格式),然后用 'utf-8' ...
- python 连加
sum= number=int(input('请输入整数: ')) #递增for循环,从小到大打印出数字 print('从小到大排列输出数字:') ,number+): sum+=i #设置sum为i ...
- testNG 学习笔记 Day2 配置testNG自带的监听器
IntelliJ IDEA配置testNG自带的监听器的时候,操作如下菜单栏中 run ----> 下拉菜单中的 Edit Configurations ----> 新矿口中TeatNG下 ...
- IDEA配置GIT
注:此方法可用于配置gitlab也可用于配置github 1.在github中创建一个账号:https://github.com/join?source=header-home 2.下载并安装git: ...
- 大数据学习:storm流式计算
Storm是一个分布式的.高容错的实时计算系统.Storm适用的场景: 1.Storm可以用来用来处理源源不断的消息,并将处理之后的结果保存到持久化介质中. 2.由于Storm的处理组件都是分布式的, ...