【poj 3167】Cow Patterns(字符串--KMP匹配+数据结构--树状数组)
题意:给2个数字序列 a 和 b ,问按从小到达排序后,a中的哪些子串与b的名次匹配。 a 的长度 N≤100,000,b的长度 M≤25,000,数字的大小 K≤25。
解法:【思考】1.X 暴力。枚举 a 中的子串,选出来排序后比对名次。O(n* m log m *m)=O(n*m^2*log m)。
2.X 暴力+树状数组优化。枚举 a 中的子串,选出来后比较前缀名次(P.S.这种转化常出现,比如:【洛谷 p3368】模板-树状数组 2(数据结构) 就是将个体转化为前缀。),看加上自己的之前小于等于和等于该数的个数是否相等。O(n*m log m)。
3.√ kmp+树状数组优化。直接kmp匹配 a串和 b串,next[ ]预处理 b串,再在kmp时看前缀名次来比较。(这个要kmp理解得很好才能在处理树状数组时处理得很好,我现在思绪混乱啊......代码就算了......qwq)
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<iostream>
using namespace std; const int N=,M=,K=;
struct node{int x,y,d;}b[M],a[N];
int a[N],b[M],next[M];
int cnt=,s[N];
int ca[K],cb[K]; int lowbit(int x) {return x&-x;}
int change(int x,int d)
{
for (int i=x;i<=n;i+=lowbit(i))
ca[i]+=d;
}
int getcount(int x)
{
int sum=;
for (int i=x;i>=;i-=lowbit(i))
sum+=ca[i];
return sum;
}
int change_2(int x,int d)
{
for (int i=x;i<=m;i+=lowbit(i))
cb[i]+=d;
}
int getcount_2(int x)
{
int sum=;
for (int i=x;i>=;i-=lowbit(i))
sum+=cb[i];
return sum;
}
void init_kmp()
{
memset(cb,,sizeof(cb));
memset(next,,sizeof(next));
int p=,x=,y=;
next[]=;
for (int i=;i<=m;i++)
{
while ((b[i].x!=b[p+].x||b[i].y!=b[p+].y) && p)
{
p=next[p];
}
if (b[i].x==b[p+].x&&b[i].y==b[p+].y)
{
p++;
add_2(b[i].d,);
}
next[i]=p;
}
}
void kmp()
{
int p=;
for (int i=;i<=n;i++)
{
int x=getcount_2(a[i].d-);
while ((a[i].x-(a[i-p].x+a[i-p].y)!=b[p+].x||a[i].y!=b[p+].y) && p) p=next[p];
if (a[i].x==b[p+].x&&a[i].y==b[p+].y) p++;
if (p==m) s[++cnt]=i;
}
}
int main()
{
freopen("a.in","r",stdin);
int n,m,k;
scanf("%d%d%d",&n,&m,&k);
//memset(ca,0,sizeof(ca));
for (int i=;i<=n;i++)
{
scanf("%d",&a[i].d);
/*change(a[i].d,1);
a[i].x=getcount(a[i].d);
a[i].y=a[i].x-getcount(a[i].d-1);*/
}
//memset(cb,0,sizeof(cb));
for (int i=;i<=m;i++)
{
scanf("%d",&b[i].d);
/*change_2(b[i].d,1);
b[i].x=getcount_2(b[i].d);
b[i].y=b[i].x-getcount_2(b[i].d-1);*/
}
init_kmp();
kmp();
printf("%d\n",cnt);
for (int i=;i<=cnt;i++)
printf("%d ",s[i]);
return ;
}
待修改代码...0.0
【poj 3167】Cow Patterns(字符串--KMP匹配+数据结构--树状数组)的更多相关文章
- [bzoj1892][bzoj2384][bzoj1461][Ceoi2011]Match/字符串的匹配_KMP_树状数组
2384: [Ceoi2011]Match 1892: Match 1461: 字符串的匹配 题目大意: 数据范围: 题解: 很巧妙的一道题呀. 需要对$KMP$算法有很深的理解才行. 首先我们需要发 ...
- POJ 3167 Cow Patterns (KMP+前缀和)
题意:给你两串数字,长度分别为n和m,数字大小在[1,25].当后一串数字每个数字的排名位置与前一串数字(任一长度为m的子串)每个数字的排名位置一致时就完全匹配,最后求哪些位置是完全匹配的. 例如:1 ...
- BZOJ_1264_[AHOI2006]基因匹配Match_树状数组
BZOJ_1264_[AHOI2006]基因匹配Match_树状数组 Description 基因匹配(match) 卡卡昨天晚上做梦梦见他和可可来到了另外一个星球,这个星球上生物的DNA序列由无数种 ...
- ACM数据结构-树状数组
模板: int n; int tree[LEN]; int lowbit(int x){ return x&-x; } void update(int i,int d){//index,del ...
- 「模拟赛20180306」回忆树 memory LCA+KMP+AC自动机+树状数组
题目描述 回忆树是一棵树,树边上有小写字母. 一次回忆是这样的:你想起过往,触及心底--唔,不对,我们要说题目. 这题中我们认为回忆是这样的:给定 \(2\) 个点 \(u,v\) (\(u\) 可能 ...
- bzoj1264 [AHOI2006]基因匹配Match 树状数组+lcs
1264: [AHOI2006]基因匹配Match Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 1255 Solved: 835[Submit][ ...
- BZOJ 1264: [AHOI2006]基因匹配Match 树状数组+DP
1264: [AHOI2006]基因匹配Match Description 基因匹配(match) 卡卡昨天晚上做梦梦见他和可可来到了另外一个星球,这个星球上生物的DNA序列由无数种碱基排列而成(地球 ...
- POJ 3468 A Simple Problem with Integers(树状数组区间更新)
A Simple Problem with Integers Time Limit: 5000MS Memory Limit: 131072K Total Submissions: 97217 ...
- BZOJ4990 [Usaco2017 Feb]Why Did the Cow Cross the Road II 动态规划 树状数组
欢迎访问~原文出处——博客园-zhouzhendong 去博客园看该题解 题目传送门 - BZOJ4990 题意概括 有上下两行长度为 n 的数字序列 A 和序列 B,都是 1 到 n 的排列,若 a ...
随机推荐
- sql server命令行
http://www.cnblogs.com/bingcaihuang/archive/2011/01/31/1948222.html http://www.cnblogs.com/wontonJ/a ...
- Mobilize.Net Silverlight bridge to Windows 10 UWP
Windows UWP 既 Windows 10 Universal Windows platform,这个微软基于Windows NT内核的个运行时(Runtime)平台,此平台横跨所有的 Wind ...
- Win8.1 Metro应用无法联网终极解决方法
Win8.1 Metro应用无法联网终极解决方法: 一.删除注册表中:HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\services\WinSock2\Par ...
- mysql同主机数据库复制
我们有时候需要在测试环境和生产环境下做交换.以下可以快速的复制数据库,支持大容量(1G以上) 1.将database_DEV数据库导成database_DEV.contents.gz压缩文件 mysq ...
- Eclipse:Cannot complete the install because of a conflicting dependency.问题解决
今天尝试在线更新ADT(22到23)的时候,遇到了这么个问题,从错误提示中初步看起来是存在引用的冲突: 估计大家在把22升级到23的时候都会遇上这个问题,新旧版冲突,感觉像是ADT自己的bug. 其实 ...
- zeromq 测试总结
总结 测试项目 github (https://github.com/solq360/jmzq) 非常不稳定 pub/sub 模式 30W压测丢了27W条消息,官方没有给出任何的发送状态供业务层处理 ...
- SSH: 本地.ssh目录下的公钥文件最好删掉
这次ssh amazon ec2的instance,在家里电脑登录OK,到了公司电脑登录失败(只支持公钥机制).私钥已经拷贝到公司的ubuntu上了,奇怪. 后来发现是.ssh目录下存在一些公钥文件导 ...
- jquery 按钮效果 正常、移上、按下
在网页设计过程中,经常遇见按钮的各状态效果.写了一个jquery扩展,使这个过程更方便! 使用前注意引用Jquery: JqueryExtend.js: (function ($) { // Butt ...
- grunt压缩多个js文件和css文件
压缩前的工程目录: 1.安装js,css需要的插件 使用npm安装:npm install grunt-contrib-uglify --save-dev -------->安装js压缩插件 ...
- 客户端请求、服务器响应及其HTTP状态码
一JSP客户端请求 当浏览器请求一个网页时,它会向网络服务器发送一系列不能被直接读取的信息,因为这些信息是作为HTTP信 息头的一部分来传送的.我们可以查阅HTTP协议来获得更多的信息. 下表列出了浏 ...