【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 ...
随机推荐
- IOC容器特性注入第一篇:程序集反射查找
学习kooboo的框架发现它的注入容器方法比较特别,同样是利用MVC的注入点,但它是查找网站下面bin所有的DLL利用反射查找特性找到对应的服务注入到容器. 这样的好处很简单:完全可以不用关心IOC容 ...
- VC中使用ATL库实现正则表达式匹配(ADODB::Error)
1. 确保项目属性中ATL使用处于打开状态. 如VS中项目属性常规—ATL使用—静态链接到ATL 2. 在使用时加上头文件 #include "atlrx.h" 3. 使用示例代码 ...
- Android之布局onClick属性写法规则
/** Called when the user clicks the Send button */public void sendMessage(View view) { // Do some ...
- 关于fork的一道经典面试题
这是一道面试题,问程序最终输出几个“-”: #include<stdio.h> #include<sys/types.h> #include<unistd.h> i ...
- JDBC连接SQL Server2008
在使用JDBC连接数据库之前首先要加载相应数据库的JDBC驱动类,可以通过通用方法Class.forName来加载驱动类. 方式一:使用JDBC-ODBC连接桥 一般安装JDK后会自带JDBC-O ...
- AndroidUI优化工具——HierarchyViewer
先说些题外话,希望路过的各位支持,博主有幸成为2013年度博客之星的候选人,期待你的一票,谢谢. 投票猛击: http://vote.blog.csdn.net/blogstaritem/blogst ...
- Lambda动态创建
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.T ...
- 模拟Jquery选择器
目前实现的功能有以下几点: 1.$("#adom"); // 返回id为adom的DOM对象 2.$("a"); // 返回一个a标签的数组 3.$(" ...
- html5 自定义数据属性 ,也就是 data-* 自定义属性---笔记。
html5 自定义数据属性 ,也就是 data-* 自定义属性. 例如 <div data-last-value="43" data-hidden="true& ...
- Linux - Yum的常用方法总结
简述 rpm是由红帽公司开发的软件包管理方式,使用rpm可以方便的进行软件的安装.查询.卸载.升级等工作. 但是rpm软件包之间的依赖性问题往往会很繁琐,尤其是软件由多个rpm包组成时. Yum(全称 ...