BZOJ_3207_花神的嘲讽计划1_(Hash+主席树)
描述
http://www.lydsy.com/JudgeOnline/problem.php?id=3207
给出一个长度为\(n\)的串,以及\(m\)个长度为\(k\)的串,求每个长度为\(k\)的串在原串\([x,y]\)区间是否出现过.
分析
这道题要求对比长度为\(k\)的串,于是我们把这些串的Hash值都算出来,问题就转化成了求\([x,y]\)的区间中是否出现过某Hash值.
求区间中某一个值出现了多少次,可以用主席树.
p.s.
1.学习了主席树指针的写法,比数组慢好多啊...看来有必要去学一学平衡树的数组写法...不过好处是不用自己算空间...
2.这道题自己算空间的话会MLE,所以卡着空间限制就好,估计数据比较小,可以过.
数组:
#include <bits/stdc++.h>
using namespace std; const int maxn=+,X=;
typedef unsigned long long ull;
const ull INF=~0ull;
int n,m,k,cnt;
int a[maxn],rt[maxn];
ull s[maxn],x=;
struct node{ int l,r,s; }t[maxn*];
inline int read(int &x){ x=;int k=;char c;for(c=getchar();c<''||c>'';c=getchar())if(c=='-')k=-;for(;c>=''&&c<='';c=getchar())x=x*+c-'';return x*=k; }
void update(ull l,ull r,int &pos,ull d){
t[++cnt]=t[pos]; pos=cnt; t[pos].s++;
if(l==r) return;
ull mid=l+(r-l)/;
if(d<=mid) update(l,mid,t[pos].l,d);
else update(mid+,r,t[pos].r,d);
}
bool query(int x,int y,ull l,ull r,ull d){
if(t[y].s-t[x].s==) return false;
if(l==r) return true;
ull mid=l+(r-l)/;
if(d<=mid) return query(t[x].l,t[y].l,l,mid,d);
else return query(t[x].r,t[y].r,mid+,r,d);
}
int main(){
read(n); read(m); read(k);
for(int i=;i<=n;i++){
read(a[i]);
s[i]=s[i-]*X+(ull)a[i];
}
for(int i=;i<=k;i++) x*=X;
for(int i=k;i<=n;i++) rt[i]=rt[i-], update(0ull,INF,rt[i],s[i]-s[i-k]*x);
for(int i=;i<=m;i++){
ull hash=; bool ans;
int l,r; read(l); read(r);
for(int j=,t;j<=k;j++) hash=hash*X+read(t);
if(r+-l<k) ans=false;
else ans=query(rt[l+k-],rt[r],0ull,INF,hash);
ans?puts("No"):puts("Yes");
}
return ;
}
指针:
#include <bits/stdc++.h>
using namespace std; const int maxn=+,X=;
typedef unsigned long long ull;
const ull INF=~0ull;
int n,m,k,cnt;
int a[maxn];
ull s[maxn],x=;
struct node{
node* l,* r; int s;
node(){}
node(node *l,node* r,int s):l(l),r(r),s(s){}
}* rt[maxn],* null;
inline int read(int &x){ x=;int k=;char c;for(c=getchar();c<''||c>'';c=getchar())if(c=='-')k=-;for(;c>=''&&c<='';c=getchar())x=x*+c-'';return x*=k; }
node* update(node* t,ull l,ull r,ull d){
if(l==r) return new node(null,null,t->s+);
ull mid=l+(r-l)/;
if(d<=mid) return new node(update(t->l,l,mid,d),t->r,t->s+);
else return new node(t->l,update(t->r,mid+,r,d),t->s+);
}
bool query(node* x,node* y,ull l,ull r,ull d){
if(y->s-x->s==) return false;
if(l==r) return true;
ull mid=l+(r-l)/;
if(d<=mid) return query(x->l,y->l,l,mid,d);
else return query(x->r,y->r,mid+,r,d);
}
int main(){
read(n); read(m); read(k);
null=new node;
null->l=null, null->r=null, null->s=;
for(int i=;i<=n;i++){
read(a[i]);
s[i]=s[i-]*X+(ull)a[i];
}
for(int i=;i<=k;i++) x*=X;
rt[k-]=new node(null,null,);
for(int i=k;i<=n;i++) rt[i]=update(rt[i-],0ull,INF,s[i]-s[i-k]*x);
for(int i=;i<=m;i++){
ull hash=; bool ans;
int l,r; read(l); read(r);
for(int j=,t;j<=k;j++) hash=hash*X+read(t);
if(r+-l<k) ans=false;
else ans=query(rt[l+k-],rt[r],0ull,INF,hash);
ans?puts("No"):puts("Yes");
}
return ;
}
BZOJ_3207_花神的嘲讽计划1_(Hash+主席树)的更多相关文章
- BZOJ_3207_花神的嘲讽计划Ⅰ_哈希+主席树
BZOJ_3207_花神的嘲讽计划Ⅰ_哈希+主席树 Description 背景 花神是神,一大癖好就是嘲讽大J,举例如下: “哎你傻不傻的![hqz:大笨J]” “这道题又被J屎过了!!” “J这程 ...
- BZOJ3207: 花神的嘲讽计划Ⅰ(hash)
3207: 花神的嘲讽计划Ⅰ Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 3569 Solved: 1258[Submit][Status][Di ...
- [BZOJ 3207] 花神的嘲讽计划Ⅰ【Hash + 可持久化线段树】
题目链接:BZOJ - 3207 题目分析 先使用Hash,把每个长度为 k 的序列转为一个整数,然后题目就转化为了询问某个区间内有没有整数 x . 这一步可以使用可持久化线段树来做,虽然感觉可以有更 ...
- [bzoj3207]花神的嘲讽计划Ⅰ[可持久化线段树,hash]
将每k个数字求一个哈希值,存入可持久化线段树,直接查询即可 #include <iostream> #include <algorithm> #include <cstd ...
- BZOJ 3207 花神的嘲讽计划Ⅰ(函数式线段树)
题目链接:http://61.187.179.132/JudgeOnline/problem.php?id=3207 题意:给出一个数列,若干询问.每个询问查询[L,R]区间内是否存在某个长度为K的子 ...
- 【BZOJ3207】花神的嘲讽计划Ⅰ Hash+主席树
[BZOJ3207]花神的嘲讽计划Ⅰ Description 背景 花神是神,一大癖好就是嘲讽大J,举例如下: “哎你傻不傻的![hqz:大笨J]” “这道题又被J屎过了!!” “J这程序怎么跑这么快 ...
- bzoj 3207 花神的嘲讽计划Ⅰ 主席树+hash
花神的嘲讽计划Ⅰ Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 3112 Solved: 1086[Submit][Status][Discuss] ...
- BZOJ 3207: 花神的嘲讽计划Ⅰ( hash + 可持久化线段树 )
O(NK)暴力搞出所有子串的哈希值, 然后就对哈希值离散化建权值线段树, 就是主席树的经典做法了.总时间复杂度O(NK+(N+Q)logN) ----------------------------- ...
- 【BZOJ3207】花神的嘲讽计划I 可持久化线段树/莫队
看到题目就可以想到hash 然后很自然的联想到可持久化权值线段树 WA:base取了偶数 这道题还可以用莫队做,比线段树快一些 可持久化线段树: #include<bits/stdc++.h&g ...
随机推荐
- intellij idea社区版 & maven & git & tomcat/jetty 的struts2项目的搭建
1.新建一个project,并在project下新建一个maven module.
- Project Israfil -- 支持多个音乐平台的开源音乐服务
Israfil |关于|当前进度|开发日志|下载软件|编译|参与项目|编译状态|版权|协议| LER0ever Project Israfil Provide Unified Music Se ...
- ThreadPoolExecutor 线程池的实现
ThreadPoolExecutor继承自 AbstractExecutorService.AbstractExecutorService实现了 ExecutorService 接口. 顾名思义,线程 ...
- shell环境
1 引言 一个进程运行在shell环境中,理解进程运行的环境是十分重要的.环境影响着进程的行为,利用环境提供的便利,可以极大地提高开发效率.本节深入讨论shell中与进程有关的环境问题,包括命令行参数 ...
- 探究为何rem在chrome浏览器上计算出错
最近在一个项目中,测试同学提了一个bug,说手机上有个页面的某些字体显示偏大.就像这样 我用chrome浏览器在pc上测试了一下,发现pc上也有这个问题,但是用其它浏览器打开这个页面就没有发现这个问题 ...
- sae-xhprof调试性能
1. 在storage中创建xhprof的domain 2.在xhprof中,给对应的版本应用开启调试 3.在版本内的代码加入 sae_xhprof_start(); // 需要调优的代码 // .. ...
- php用户验证代码的简单例子
发布:sunday01 来源:net [大 中 小] 分享一个简单的php用户验证代码,适合初学的朋友参考,主要学习$_post传递数据及isset检测变量的方法. php简单用户验证代码 ...
- Linux硬链接和符号链接(转)
Linux链接分两种,一种被称为硬链接(Hard Link),另一种被称为符号链接(Symbolic Link).默认情况下,ln命令产生硬链接. [硬连接] 硬连接指通过索引节点来进行连接.在Li ...
- Wix 安装部署(一)同MSBuild 自动生成打包文件 转
原文地址:http://www.cnblogs.com/stoneniqiu/p/3355086.html 因为项目需要,最近在研究Wix打包部署,园子里也有一些关于wix的博客,方方面面,讲的点各不 ...
- C++函数转换成C#函数
/// /// </param> /// <returns></returns> ...