题意:给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.暴力+树状数组优化。枚举 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. vs2010 “最近使用的项目”为空?解决办法!

    本文转自http://blog.csdn.net/likaibs/article/details/39576361 谢谢该作者的分享,我在这里继续发扬光大,直接把原文粘贴过来,方便后面的朋友查看. “ ...

  2. CISA 信息系统审计知识点 [第二章. IT治理和管理 ]

    第二章.  IT治理和管理 1.  IT治理.管理.安全和控制框架及标准.指南和实践 IT治理是董事会和执行管理层的职责. IT治理的关键因素:保持与业务的战略一致,引导业务价值的实现. IT治理关注 ...

  3. 介绍几个工作开发中封装的好用的android自定义控件

    首先看效果图, 看下这两个界面,第一个中用到了一个自定义的FlowRadioGroup,支持复合子控件,自定义布局: 第二个界面中看到了输入的数字 自动4位分割了吧:也用到了自定义的DivisionE ...

  4. WindowsStore页面导航

    第一个页面:前台 <Grid Background="{StaticResource ApplicationPageBackgroundThemeBrush}"> &l ...

  5. JavaScript - javascript 中的 "||" 与 "&&" 的理解与灵活运

    你肯定见到过这样的代码:a = a||"xxx". 它其实就等价于下面三种形式的代码: a = a || "xxx"; 与: if (!a) { a = &qu ...

  6. vm导入后远程桌面无法登陆域账户

    以本地Admin账户登录,打开C:\Windows\System32\sysprep目录,运行sysprep.exe工具,勾选Generalize,点击OK.系统重启后对Windows重新初始化,生成 ...

  7. CentOS7之VMware安装

    选择CentOS的原因 起初也了解了几个linux的发行版,最终决定选择centOS的原因却很简单:阿里云和腾讯云提供的云服务器中centos的版本最多.  VMware12的安装 下载地址:http ...

  8. ps裁剪圆角

    1.打开要编辑的图片 2.选择圆角矩形工具,并调整半径(半径越大,角越圆),本例半径为20像素 3.使用上述工具画出选区 4.按下ctrl+enter,可以看到选区边缘描上了虚线 5.菜单栏-图像-剪 ...

  9. Legolas工业自动化平台入门(三)交互事件响应动作

    在上一篇Legolas工业自动化平台入门(二)数据响应动作 一文中,我们介绍了"动作"相关内容,了解到"动作"分为多种,各种动作的添加方式相同,但是应用方式各自 ...

  10. Android代码优化工具——Android lint

    作为移动应用开发者,我们总希望发布的apk文件越小越好,不希望资源文件没有用到的图片资源也被打包进apk,不希望应用中使用了高于minSdk的api,也不希望AndroidManifest文件存在异常 ...