【字符串哈希】【莫队算法】bzoj3207 花神的嘲讽计划Ⅰ
既然询问的长度是确定的,那么我们可以将所有长度为K的字串弄个哈希值出来,这样字串存在性=>哈希值存在性。
自然上溢哈希,base=107比较不错。
序列长度n=>n-K+1
询问区间[x,y]=>[x,y-K+1]
注意特判x是否>y-K+1
然后我们注意到没有修改,于是将哈希值离散化后,莫队大法好。
#include<cstdio>
#include<cmath>
#include<algorithm>
using namespace std;
typedef unsigned long long ull;
int f,C;
inline void R(int &x){
C=0;f=1;
for(;C<'0'||C>'9';C=getchar())if(C=='-')f=-1;
for(x=0;C>='0'&&C<='9';C=getchar())(x*=10)+=(C-'0');
x*=f;
}
#define N 200001
#define seed 107
ull seedK=1;
int n,m,K,a[N<<1],c[N],en,en2,X;
int num[N],b[N<<1],sum=1;
bool anss[N];
struct Point{ull v;int p;}t[N<<1];
struct Ask{int l,r,x,p;}Q[N];
bool operator < (const Point &a,const Point &b){return a.v<b.v;}
bool operator < (const Ask &a,const Ask &b)
{return num[a.l]!=num[b.l] ? num[a.l]<num[b.l] : a.r<b.r;}
void Mo_Make_Block()
{
int sum=1,sz=sqrt(n); if(!sz) sz=1;
for(;sum*sz<n;++sum)
{
int r=sum*sz;
for(int i=(sum-1)*sz+1;i<=r;++i) num[i]=sum;
}
for(int i=(sum-1)*sz+1;i<=n;++i) num[i]=sum;
}
int main()
{
R(n); R(m); R(K);
for(int i=1;i<=K;++i)
seedK=seedK*seed;
for(int i=1;i<=n;++i) R(c[i]);
ull hs=0;
for(int i=1;i<=K;++i) hs=hs*seed+(ull)c[i];
for(int i=K+1;i<=n;++i)
{
t[++en].v=hs; t[en].p=en;
hs=hs*seed+(ull)c[i];
hs-=c[en]*seedK;
}
t[++en].v=hs; t[en].p=en;
int Record=en;
for(int i=1;i<=m;++i)
{
R(Q[i].l); R(Q[i].r);
Q[i].p=i;
Q[i].r=Q[i].r-K+1;
hs=0;
for(int j=1;j<=K;++j)
{
R(X);
hs=hs*seed+(ull)X;
}
t[++en].v=hs; t[en].p=en;
}
sort(t+1,t+en+1);
a[t[1].p]=++en2;
for(int i=2;i<=en;++i)
{
if(t[i].v!=t[i-1].v) ++en2;
a[t[i].p]=en2;
}
en=Record;
for(int i=1;i<=m;++i) Q[i].x=a[++en];
Mo_Make_Block();
sort(Q+1,Q+m+1);
for(int i=Q[1].l;i<=Q[1].r;++i) ++b[a[i]];
if(Q[1].l<=Q[1].r) anss[Q[1].p]=b[Q[1].x];
else anss[Q[1].p]=0;
for(int i=2;i<=m;++i)
{
if(Q[i].l<Q[i-1].l) for(int j=Q[i-1].l-1;j>=Q[i].l;--j) ++b[a[j]];
else for(int j=Q[i-1].l;j<Q[i].l;++j) --b[a[j]];
if(Q[i].r<Q[i-1].r) for(int j=Q[i-1].r;j>Q[i].r;--j) --b[a[j]];
else for(int j=Q[i-1].r+1;j<=Q[i].r;++j) ++b[a[j]];
if(Q[i].l<=Q[i].r) anss[Q[i].p]=b[Q[i].x];
else anss[Q[i].p]=0;
}
for(int i=1;i<=m;++i) puts(anss[i]?"No":"Yes");
return 0;
}
【字符串哈希】【莫队算法】bzoj3207 花神的嘲讽计划Ⅰ的更多相关文章
- bzoj3207花神的嘲讽计划Ⅰ
题意:http://www.lydsy.com/JudgeOnline/problem.php?id=3207 给定一个原字符串和m个询问,每次查询原字符串[l,r]内是否包含给定字符串s (len( ...
- BZOJ3207: 花神的嘲讽计划Ⅰ(hash)
3207: 花神的嘲讽计划Ⅰ Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 3569 Solved: 1258[Submit][Status][Di ...
- [bzoj3207][花神的嘲讽计划Ⅰ] (字符串哈希+主席树)
Description 背景 花神是神,一大癖好就是嘲讽大J,举例如下: “哎你傻不傻的![hqz:大笨J]” “这道题又被J屎过了!!” “J这程序怎么跑这么快!J要逆袭了!” …… 描述 这一天D ...
- 【Luogu】P3709大爷的字符串题(莫队算法)
题目链接 语文题啊…… 看题解发现是让求区间中最多的数的个数,于是果断理解了一会题解……莫队套上完事. sum[i]表示i这个数出现的次数,cnt[i]表示出现i次的数有几个,然后乱搞搞……就好了 # ...
- [BZOJ3207] 花神的嘲讽计划Ⅰ (主席树)
Description 背景 花神是神,一大癖好就是嘲讽大J,举例如下: “哎你傻不傻的![hqz:大笨J]” “这道题又被J屎过了!!” “J这程序怎么跑这么快!J要逆袭了!” …… 描述 这一天D ...
- BZOJ3207 花神的嘲讽计划I
Time Limit: 10 Sec Memory Limit: 128 MB Summary 给你一个模式串P,q个询问,对每个询问回答从Pl到Pr是否存在与给定串相同的子串,同时有所有的给定串长度 ...
- BZOJ3207花神的嘲讽计划Ⅰ——主席树+hash
题目描述 背景 花神是神,一大癖好就是嘲讽大J,举例如下: “哎你傻不傻的![hqz:大笨J]” “这道题又被J屎过了!!” “J这程序怎么跑这么快!J要逆袭了!” …… 描述 这一天DJ在给吾等众蒟 ...
- [bzoj3207]花神的嘲讽计划Ⅰ[可持久化线段树,hash]
将每k个数字求一个哈希值,存入可持久化线段树,直接查询即可 #include <iostream> #include <algorithm> #include <cstd ...
- BZOJ3207: 花神的嘲讽计划Ⅰ
显然hash,然后stl随便搞. #include<bits/stdc++.h> #define N 100005 using namespace std; typedef unsigne ...
随机推荐
- HDU4280:Island Transport(最大流)
Island Transport Time Limit: 20000/10000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Other ...
- php-instanceof运算符
1.关于 instanceof 的一些基本概念 1).instanceof 用于确定一个PHP变量是否属于某一类class的实例: <?php class MyClass { } class N ...
- Spring学习--使用 utility scheme 定义集合及 p命名空间
util schema 定义集合: 使用基本的集合标签定义集合时 , 不能将集合作为独立的 Bean 定义 , 导致其他 Bean 无法引用该集合 , 所以无法在不同 Bean 之间共享集合. 可以用 ...
- eclipse配置文件内存设置
1.-Xms64m -Xmx128m 2.配置文件的修改 http://wenku.baidu.com/link?url=spM-qCe0qHdhiykzwuzp-vBtcQrVtAzYiWe8uex ...
- Round 0: Regionals 2010 :: NEERC Eastern Subregional
Round 0: Regionals 2010 :: NEERC Eastern Subregional 贴吧题解(官方)? 网上的题解 水 A Murphy's Law 题意:Anka拿着一块涂着黄 ...
- [BZOJ1025] [SCOI2009]游戏 解题报告
Description windy学会了一种游戏.对于1到N这N个数字,都有唯一且不同的1到N的数字与之对应.最开始windy把数字按顺序1,2,3,……,N写一排在纸上.然后再在这一排下面写上它们对 ...
- [bzoj3990][SDOI2015]排序-搜索
Brief Description 小A有一个1-2^N的排列A[1..2^N],他希望将A数组从小到大排序,小A可以执行的操作有N种,每种操作最多可以执行一次,对于所有的i(1<=i<= ...
- [bzoj1798][Ahoi2009]Seq——线段树+多重标记下传
题意 请你写一个数据结构,支持: 子序列同加 子序列同乘 统计子序列和 题目 线段树裸题,但对于我这种初学者还是非常难写. 我们维护两个标记,一个是在这个节点上作过的所有乘法操作,一个是加法操作,始终 ...
- poj 1528 Perfection
题目链接:http://poj.org/problem?id=1528 题目大意:输入一个数n,然后求出约数的和sum,在与这一个数n进行比较,如果sum>n,则输出ABUNDANT,如果sum ...
- KVM的ept机制
转载:http://ytliu.info/blog/2014/11/24/shi-shang-zui-xiang-xi-de-kvm-mmu-pagejie-gou-he-yong-fa-jie-xi ...