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

分类上来讲,还是一道很好的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. 小工具:word表格文字转化成insert语句

    群里的一个朋友有个需要,要让把word里的表格数据插入到数据库里面. 我的思路是,把格式化的数据转成insert语句,然后去执行就可以了. 要求的insert语句格式是:'insert into xx ...

  2. HTTP If-Modified-Since引发的浏览器缓存汇总

    在看Spring中HttpServlet的Service方法时,对于GET请求,代码逻辑如下: if (method.equals(METHOD_GET)) { long lastModified = ...

  3. bzoj 3343: 教主的魔法

    Time Limit: 10 Sec  Memory Limit: 256 MBSubmit: 924  Solved: 402[Submit][Status][Discuss] Descriptio ...

  4. 将Sublime Text 添加到鼠标右键菜单的教程方法

    安装notepad++软件,在菜单右键自动会添加“edit with notepad++"的选项,那么怎么将Sublime Text 添加到鼠标右键菜单呢?下面是我的操作过程,希望有帮助! ...

  5. Linux(CentOS 6.5) 下安装MySql 5.7.18 二进制版本粗浅攻略

    鉴于Linux和mysql因不同版本,安装方式也不同,所以在阅读本攻略前,请确保各位同学的版本和我的Linux.MySql 版本一致. 如果不一致,只能参考. 我的版本: Linux CentOS 6 ...

  6. Linux——权限管理命令简单笔记

    首先linux中的权限分为三种rwx 代表字符 权限 对文件的含义 对目录的含义 r 读权限 可以查看文件 内容 (cat, more, head, tail) 可以列出目录中 的内容 (ls) w ...

  7. go 并发 demo

    两个进程执行两个goroutine // This sample program demonstrates how to create goroutines and // how the schedu ...

  8. DEV-C++设置C++11标准

    DEV-C++默认的标准是C++98,改成C++11的方法如下: Tools -> Compiler Options -> Setting -> Code Generation -& ...

  9. 装B必备之 快捷键配置

    作为一个程序员 所有程序都用快捷来这是装B必备的无形装B 最为致命.... 开始搞起 第一步配置环境变量 在系统D盘新建一个文件夹  D:\cache; 然后把这个路径 配置上 D:\cache; 最 ...

  10. Java入门:零碎的知识点

    实例变量经常被称为属性 成员变量和局部变量:前者在类中定义,后者在类的方法中定义且系统不会自动赋初始值 我们创建一个对象的时候实际上执行的是无参的构造方法 静态变量 static String arr ...