题意:给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匹配+数据结构--树状数组)的更多相关文章

  1. [bzoj1892][bzoj2384][bzoj1461][Ceoi2011]Match/字符串的匹配_KMP_树状数组

    2384: [Ceoi2011]Match 1892: Match 1461: 字符串的匹配 题目大意: 数据范围: 题解: 很巧妙的一道题呀. 需要对$KMP$算法有很深的理解才行. 首先我们需要发 ...

  2. POJ 3167 Cow Patterns (KMP+前缀和)

    题意:给你两串数字,长度分别为n和m,数字大小在[1,25].当后一串数字每个数字的排名位置与前一串数字(任一长度为m的子串)每个数字的排名位置一致时就完全匹配,最后求哪些位置是完全匹配的. 例如:1 ...

  3. BZOJ_1264_[AHOI2006]基因匹配Match_树状数组

    BZOJ_1264_[AHOI2006]基因匹配Match_树状数组 Description 基因匹配(match) 卡卡昨天晚上做梦梦见他和可可来到了另外一个星球,这个星球上生物的DNA序列由无数种 ...

  4. ACM数据结构-树状数组

    模板: int n; int tree[LEN]; int lowbit(int x){ return x&-x; } void update(int i,int d){//index,del ...

  5. 「模拟赛20180306」回忆树 memory LCA+KMP+AC自动机+树状数组

    题目描述 回忆树是一棵树,树边上有小写字母. 一次回忆是这样的:你想起过往,触及心底--唔,不对,我们要说题目. 这题中我们认为回忆是这样的:给定 \(2\) 个点 \(u,v\) (\(u\) 可能 ...

  6. bzoj1264 [AHOI2006]基因匹配Match 树状数组+lcs

    1264: [AHOI2006]基因匹配Match Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 1255  Solved: 835[Submit][ ...

  7. BZOJ 1264: [AHOI2006]基因匹配Match 树状数组+DP

    1264: [AHOI2006]基因匹配Match Description 基因匹配(match) 卡卡昨天晚上做梦梦见他和可可来到了另外一个星球,这个星球上生物的DNA序列由无数种碱基排列而成(地球 ...

  8. POJ 3468 A Simple Problem with Integers(树状数组区间更新)

    A Simple Problem with Integers Time Limit: 5000MS   Memory Limit: 131072K Total Submissions: 97217   ...

  9. BZOJ4990 [Usaco2017 Feb]Why Did the Cow Cross the Road II 动态规划 树状数组

    欢迎访问~原文出处——博客园-zhouzhendong 去博客园看该题解 题目传送门 - BZOJ4990 题意概括 有上下两行长度为 n 的数字序列 A 和序列 B,都是 1 到 n 的排列,若 a ...

随机推荐

  1. Android下海康实时视频解码

    折腾了一个多月,终于调出来了.....首先吐槽一下海康SDK,同时也感谢之... 手头有个项目,需要实时抓取海康摄像头,我是在Android下实现的,海康官网上没有Android SDK,这里友情提醒 ...

  2. square开源vim,tmux配置在linux上使用

    首先安装需要的软件 apt-get install vim ack-grep git tmux gnome-terminal ctags xclip silversearcher-ag 这里tmux需 ...

  3. java之抽象类

    1.用abstract关键字来修饰一个类时,这个类叫做抽象类:用abstract来修饰一个方法时,该方法叫做抽象方法. 2.含有抽象方法的类必须被声明抽象类,抽象类必须被继承,抽象方法必须被重写. 3 ...

  4. 安卓TTS语音合成经验分享(科大讯飞语音+)集成

    应用场景:足浴软件,技师钟房安排调派和队列排序查看,语音播报提醒.老程序是使用双屏显卡,windows系统PC上运行一个无人值守桌面程序.如今安卓机顶盒(WIFI)和MINI电视棒通过HDMI接口和支 ...

  5. zepto - slice

    var ss = ['1', '2', '3', '4', '5', '6']; console.log(ss.slice(2,4));

  6. 论文第5章:Android绘图平台的实现

    面向移动设备的矢量绘图平台设计与实现 Design and Implementation of Mobile Device-oriented Vector Drawing Platform 引用本论文 ...

  7. MFC ADO连接Oracle12c数据库 客户端环境搭建

    ADO连接方式一:Provider=MSDAORA.1; 环境配置如下: 去官网下载ODAC121024Xcopy_32bit.zip安装 安装方式如下: (1)解压文件 (2)用命令行CD到该文件的 ...

  8. 爬虫技术 -- 进阶学习(八)模拟简单浏览器(附c#代码)

    由于最近在做毕业设计,需要用到一些简单的浏览器功能,于是学习了一下,顺便写篇博客~~大牛请勿喷,菜鸟练练手~ 实现界面如下:(简单朴素版@_@||) button_go实现如下: private vo ...

  9. maven pox.xml 设置主入口配置节点

    <?xml version="1.0" encoding="UTF-8"?><project xmlns="http://maven ...

  10. ubuntu14.04编译安装Git2.7

    在开源中国看文章, 随意之间, 在软件资讯栏看到git 2.7的信息. 一直在使用在git 1.9.1, 心中突感, 这个git 2.7是个什么东西, 怎么git的版本更新有如此快么. 印象里, 老外 ...