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 ...
随机推荐
- android API文档查询---context、toast、SharedPreferences
/*查阅api ---context1.abstract AssetManager getAssets() Returns an AssetManager instance for the a ...
- Fire Net
Fire Net Time Limit : 2000/1000ms (Java/Other) Memory Limit : 65536/32768K (Java/Other) Total Subm ...
- SpringMVC控制器配置文件
1 首先引入 xml 的约束 <?xml version="1.0" encoding="UTF-8"?> <beans xmlns=&quo ...
- Class类文件的结构
Class文件是一组以8位字节为基础单位的二进制流,各个数据项目严格按照顺序紧凑的排列在Class文件中,中间没有任何分隔符.Class文件的结构只有两种数据类型:无符号数和表.无符号数以u1.u2. ...
- 关于php的认识和介绍
php的介绍: 什么是php? <1>:php是一个编程语言 <2>:php是处理php编程语言的一个软件.php语言必须运行在php软件上. 为什么要学习php? php可以 ...
- ssh自动登录的4种实现方法
ssh自动登录的几种实现方法,记录在此. 1. 自动ssh/scp方法 A为本地主机(即用于控制其他主机的机器) ; B为远程主机(即被控制的机器Server), 假如ip为192.168.60.1 ...
- #Leet Code# Gray Code
描述: 要求相邻数2进制差一位 先获得n-1的列表表示小于 2^(n-1) 的符合要求的列表,加上最高位的加成 2^(n-1) 就是大于等于 2^(n-1) 的符合要求的列表,后者翻转一下就能够与前者 ...
- An error occurred while collecting items to be installed session context was:(profile=DefaultProfile... 解决方案
遇到同样问题的小伙伴请:点击Eclipse上方工具栏中help --> Install new software... --> 看图 点击进红框的位置在打开的窗口中,将窗口右侧的Avail ...
- jquery 验证插件 validate
1)required:true 必输字段(2)remote:"check.php" 使用ajax方法调用check.php验证输入值(3)email:true 必须输入正确格式的电 ...
- NGUI系列教程四(自定义Atlas,Font)
今天我们来看一下怎么自定义NGUIAtlas,制作属于自己风格的UI.第一部分:自定义 Atlas1 . 首先我们要准备一些图标素材,也就是我们的UI素材,将其导入到unity工程中.2. 全选我们需 ...