bzoj 3207: 花神的嘲讽计划Ⅰ
Description
Input
Output
Sample Input
1 2 3 4 5 6 7 8
2 5 2 3 4
1 8 3 2 1
5 7 4 5 6
2 5 1 2 3
1 7 3 4 5
Sample Output
Yes
Yes
Yes
No
HINT
Source
这题问的是子串,一开始以为是子序列...
因为嘲讽方案的长度确定,所以l和r移动时只要考虑一个子串的变化,直接上莫队即可
这就转化为子串在区间中是否出现,经典的莫队问题判断子串用哈希即可
哈希桶存不下,但满足条件的子串是n-k个离散化一下即可
#include<iostream>
#include<algorithm>
#include<cstring>
#include<cstdio>
#include<cmath>
#define int long long
using namespace std;
const int N=100010;
int gi(){
int x=0;
char ch=getchar();
while(ch<'0'||ch>'9') ch=getchar();
while(ch>='0'&&ch<='9') x=x*10+ch-'0',ch=getchar();
return x;
}
long long pre[N],hsh[3][N],num[N],cf[N],u[N];
int cnt[N],ans[N],a[N],pos[N],block;
int query(int l,int r,int flag){
return hsh[flag][r]-hsh[flag][l-1]*pre[r-l+1];
}
struct data{
int l,r,id;long long cf;
}q[N];
bool cmp(const data &a,const data &b)
{
if(pos[a.l]==pos[b.l]) return a.r<b.r;
return pos[a.l]<pos[b.l];
}
main(){
int n=gi(),m=gi(),k=gi();
for(int i=1;i<=n;i++) a[i]=gi();
pre[0]=1;for(int i=1;i<=n;i++) pre[i]=pre[i-1]*233;
for(int i=1;i<=n;i++) hsh[1][i]=hsh[1][i-1]*233+a[i];
int t=0;for(int i=n;i>=k;i--) u[++t]=num[i]=query(i-k+1,i,1);
sort(u+1,u+t+1);t=unique(u+1,u+t+1)-u-1;
for(int i=k;i<=n;i++) num[i]=lower_bound(u+1,u+t+1,num[i])-u;
for(int i=1;i<=m;i++){
q[i].l=gi()+k-1,q[i].r=gi();q[i].id=i;
for(int j=1;j<=k;j++) cf[j]=gi();
for(int j=1;j<=k;j++) hsh[2][j]=hsh[2][j-1]*233+cf[j];
q[i].cf=query(1,k,2);int id=lower_bound(u+1,u+t+1,q[i].cf)-u;
if(q[i].cf==u[id]) q[i].cf=id;
else q[i].cf=0;
}
block=sqrt(n);for(int i=1;i<=n;i++) pos[i]=(i-1)/block+1;
sort(q+1,q+1+m,cmp);
int l=k,r=k-1;
for(int i=1;i<=m;i++){
while(r<q[i].r) r++,cnt[num[r]]++;
while(l>q[i].l) l--,cnt[num[l]]++;
while(r>q[i].r) cnt[num[r]]--,r--;
while(l<q[i].l) cnt[num[l]]--,l++;
if(!cnt[q[i].cf])ans[q[i].id]=1;
}
for(int i=1;i<=m;i++)puts(ans[i]?"Yes":"No");
return 0;
}
bzoj 3207: 花神的嘲讽计划Ⅰ的更多相关文章
- BZOJ 3207: 花神的嘲讽计划Ⅰ( hash + 可持久化线段树 )
O(NK)暴力搞出所有子串的哈希值, 然后就对哈希值离散化建权值线段树, 就是主席树的经典做法了.总时间复杂度O(NK+(N+Q)logN) ----------------------------- ...
- bzoj 3207 花神的嘲讽计划Ⅰ 主席树+hash
花神的嘲讽计划Ⅰ Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 3112 Solved: 1086[Submit][Status][Discuss] ...
- [BZOJ 3207] 花神的嘲讽计划Ⅰ【Hash + 可持久化线段树】
题目链接:BZOJ - 3207 题目分析 先使用Hash,把每个长度为 k 的序列转为一个整数,然后题目就转化为了询问某个区间内有没有整数 x . 这一步可以使用可持久化线段树来做,虽然感觉可以有更 ...
- BZOJ 3207 花神的嘲讽计划Ⅰ(函数式线段树)
题目链接:http://61.187.179.132/JudgeOnline/problem.php?id=3207 题意:给出一个数列,若干询问.每个询问查询[L,R]区间内是否存在某个长度为K的子 ...
- bzoj 3207 花神的嘲讽计划Ⅰ(哈希法+主席树)
[题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=3207 [题意] 给定一个文本串,多次询问K长的模式串是否在文本[l,r]区间内出现. ...
- BZOJ 3207: 花神的嘲讽计划Ⅰ(莫队+哈希)
传送门 解题思路 刚开始写了个莫队+哈希+\(map\)的\(O(n\sqrt(n)log(n)\)的辣鸡做法,\(T\)飞了.后来看了看别人博客发现其实并不用拿\(map\)当桶存那些哈希值.因为只 ...
- 【BZOJ】【3207】花神的嘲讽计划 I
字符串Hash+可持久化线段树 好神奇的转化…… 蒟蒻一开始还去想AC自动机去了……然而由于a[i]的范围是小于等于n,怎么也想不出一个时间复杂度合理的方法 膜拜了题解0.0原来是字符串Hash! 首 ...
- 【BZOJ3207】花神的嘲讽计划I 可持久化线段树/莫队
看到题目就可以想到hash 然后很自然的联想到可持久化权值线段树 WA:base取了偶数 这道题还可以用莫队做,比线段树快一些 可持久化线段树: #include<bits/stdc++.h&g ...
- BZOJ3207: 花神的嘲讽计划Ⅰ(hash)
3207: 花神的嘲讽计划Ⅰ Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 3569 Solved: 1258[Submit][Status][Di ...
随机推荐
- 使用语句清除sqlserver数据库日志文件
修改其中的3个参数(数据库名,日志文件名,和目标日志文件的大小),运行即可 SET NOCOUNT ON DECLARE @LogicalFileName sysname, @MaxMinutes I ...
- Function Programming - 纯函数(Pure Function)
纯函数的定义,非常重要!! Pure function 意指相同的输入,永远会得到相同的输出,而且没有任何显著的副作用. 老样子,我们还是从最简单的栗子开始: var minimum = 21; va ...
- 2719:陶陶摘苹果-poj
2719:陶陶摘苹果 总时间限制: 1000ms 内存限制: 65536kB 描述 陶陶家的院子里有一棵苹果树,每到秋天树上就会结出10个苹果.苹果成熟的时候,陶陶就会跑去摘苹果.陶陶有个30厘米 ...
- Linux 链接详解----静态链接实例分析
由Linux链接详解(1)中我们简单的分析了静态库的引用解析和重定位的内容, 下面我们结合实例来看一下静态链接重定位过程. /* * a.c */ ; void add(int c); int mai ...
- nginx+tomcat安装配置
nginx+tomcat安装配置 # nginx+tomcat安装配置 #创建网站目录 mkdir -p /www/wwwroot cd /www #安装配置 wget http://mirrors. ...
- 38.Linux驱动调试-根据系统时钟定位出错位置
当内核或驱动出现僵死bug,导致系统无法正常运行,怎么找到是哪个函数的位置导致的? 答,通过内核的系统时钟,因为它是由定时器中断产生的,每隔一定时间便会触发一次,所以当CPU一直在某个进程中时,我们便 ...
- springmvc关于前台日期作为实体类对象参数类型转换错误
页面报错: 后台错误: Field error in object 'user' on field 'birthday': rejected value [2013-06-24]; codes [ty ...
- Expected MultipartHttpServletRequest: is a MultipartResolver configured解决方案
异常信息: java.lang.IllegalArgumentException: Expected MultipartHttpServletRequest: is a MultipartResolv ...
- JaveScript变量的简介及其变量的简单使用(JS知识点归纳一)
变量简介 "变量是一个容器" 为什么要有变量? 程序的执行过程中,会使用到许多的数据(用户输入的内容,动态效果的运动数据等),当这些数据需要重复在多个地方使用的时候,就需要一个容器 ...
- Triangle LeetCode |My solution
Given a triangle, find the minimum path sum from top to bottom. Each step you may move to adjacent n ...