【bzoj3207】花神的嘲讽计划Ⅰ Hash+STL-map+莫队算法
题目描述
输入
输出
样例输入
8 5 3
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
样例输出
No
Yes
Yes
Yes
No
题目大意
给出一个长度为n的序列和m个询问,每次询问需要判断给出的长度为k的序列是否在原序列的[l,r]范围内出现过,是则输出"No",否则输出"Yes"。
题解
Hash+STL-map+莫队算法
由于询问序列长度是给定的且不超过20,所以我们可以把原序列中所有长度为k的连续子序列预处理出来,并使用Hash的方法储存起来,放在一起用map离散化。
对于每个询问把它Hash出来,如果它不在原序列中出现过直接答案为0,否则用莫队算法跑一下就好了。
注意每个Hash值对应的离散化的值要先预处理出来,用桶维护出现次数,而不是用 map<unsigned long long , int> cnt 来存储出现次数,否则会TLE。
时间复杂度大概是$O((n+m)(k+\log n)+m\sqrt n)$。
#include <cstdio>
#include <cmath>
#include <algorithm>
#include <map>
#define N 100010
using namespace std;
typedef unsigned long long ull;
const ull base = 1000003;
struct data
{
int l , r , bl , id;
ull x;
}q[N];
map<ull , int> ref;
ull a[N] , val[N];
int pos[N] , cnt[N] , ans[N];
bool cmp(data a , data b)
{
return a.bl == b.bl ? a.r < b.r : a.bl < b.bl;
}
int main()
{
int n , m , k , i , j , si , lp = 1 , rp = 0;
ull t;
scanf("%d%d%d" , &n , &m , &k) , si = (int)sqrt(n);
for(i = 1 ; i <= n ; i ++ ) scanf("%llu" , &a[i]);
for(i = 1 ; i <= n - k + 1 ; i ++ )
{
for(j = 1 ; j <= k ; j ++ ) val[i] = val[i] * base + a[i + j - 1];
if(ref.find(val[i]) == ref.end()) ref[val[i]] = i;
pos[i] = ref[val[i]];
}
for(i = 1 ; i <= m ; i ++ )
{
scanf("%d%d" , &q[i].l , &q[i].r) , q[i].bl = (q[i].l - 1) / si , q[i].r -= k - 1 , q[i].id = i;
for(j = 1 ; j <= k ; j ++ ) scanf("%llu" , &t) , q[i].x = q[i].x * base + t;
}
sort(q + 1 , q + m + 1 , cmp);
for(i = 1 ; i <= m ; i ++ )
{
if(ref.find(q[i].x) == ref.end()) continue;
while(rp < q[i].r) rp ++ , cnt[pos[rp]] ++ ;
while(lp > q[i].l) lp -- , cnt[pos[lp]] ++ ;
while(rp > q[i].r) cnt[pos[rp]] -- , rp -- ;
while(lp < q[i].l) cnt[pos[lp]] -- , lp ++ ;
ans[q[i].id] = cnt[ref[q[i].x]];
}
for(i = 1 ; i <= m ; i ++ ) printf("%s\n" , ans[i] ? "No" : "Yes");
return 0;
}
【bzoj3207】花神的嘲讽计划Ⅰ Hash+STL-map+莫队算法的更多相关文章
- 【BZOJ3207】花神的嘲讽计划Ⅰ Hash+主席树
[BZOJ3207]花神的嘲讽计划Ⅰ 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 + 可持久化线段树 )
O(NK)暴力搞出所有子串的哈希值, 然后就对哈希值离散化建权值线段树, 就是主席树的经典做法了.总时间复杂度O(NK+(N+Q)logN) ----------------------------- ...
- bzoj3207花神的嘲讽计划Ⅰ
题意:http://www.lydsy.com/JudgeOnline/problem.php?id=3207 给定一个原字符串和m个询问,每次查询原字符串[l,r]内是否包含给定字符串s (len( ...
- BZOJ3207花神的嘲讽计划Ⅰ——主席树+hash
题目描述 背景 花神是神,一大癖好就是嘲讽大J,举例如下: “哎你傻不傻的![hqz:大笨J]” “这道题又被J屎过了!!” “J这程序怎么跑这么快!J要逆袭了!” …… 描述 这一天DJ在给吾等众蒟 ...
- [bzoj3207][花神的嘲讽计划Ⅰ] (字符串哈希+主席树)
Description 背景 花神是神,一大癖好就是嘲讽大J,举例如下: “哎你傻不傻的![hqz:大笨J]” “这道题又被J屎过了!!” “J这程序怎么跑这么快!J要逆袭了!” …… 描述 这一天D ...
- [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]
将每k个数字求一个哈希值,存入可持久化线段树,直接查询即可 #include <iostream> #include <algorithm> #include <cstd ...
随机推荐
- BZOJ 1137: [POI2009]Wsp 岛屿 半平面交
1137: [POI2009]Wsp 岛屿 Time Limit: 10 Sec Memory Limit: 162 MBSec Special JudgeSubmit: 165 Solved: ...
- 使用Java connector消费ABAP系统的函数
Java Connector(JCO)环境的搭建:Step by step to download and configure JCO in your laptop 我的ABAP系统有个函数名叫ZDI ...
- CF Gym 100187B A Lot of Joy (古典概型)
题意:给两个一样的只含有26个小写字母的字符串,然后两个分别做一下排列,问如果对应位置的字母相等那么就愉悦值就加一,问愉悦值的期望是多少? 题解:只考虑两个序列相对的位置,那么就相当于固定一个位置,另 ...
- HTML_2
html图像 <img>标签可以在网页上插入一张图片,它是独立使用的标签,通过‘src’属性定义图片的地址(可为绝对路径也可为相对路径),通过‘alt’属性定义图片加载时显示的文字,以及对 ...
- idea spring boot启动项目上面有红色叉
一打开IDEA,在启动debug项目有一个红色叉如下图 因为打开项目可以主项目的包没有加载进来,解决办法就是右击项目->maven->Reimport 就搞定了..
- 使用vs2013打开VS2015的工程文件的解决方案(适用于大多数vs低版本打开高版本)
前言:重装系统前我使用的是vs2015(有点装*),由于使用2015实在在班上太另类了, 导致我想在其他同学的vs下看一看我写的代码都无法达成! 而且最关键的是交作业的时候,老师的2013也没有办法打 ...
- iOS应用架构谈part4-本地持久化方案及动态部署
前言 嗯,你们要的大招.跟着这篇文章一起也发布了CTPersistance和CTJSBridge这两个库,希望大家在实际使用的时候如果遇到问题,就给我提issue或者PR或者评论区.每一个issue和 ...
- C# 使用Epplus导出Excel [5]:样式
C# 使用Epplus导出Excel [1]:导出固定列数据 C# 使用Epplus导出Excel [2]:导出动态列数据 C# 使用Epplus导出Excel [3]:合并列连续相同数据 C# 使用 ...
- Pig Latin-freecodecamp算法题目
Pig Latin 1.要求 Pig Latin把一个英文单词的第一个辅音或辅音丛(consonant cluster)移到词尾,然后加上后缀 "ay". 如果单词以元音开始,你只 ...
- NOIP模拟赛 麻将
[题目描述] 众所周知,麻将是我们国家的国粹.这段时间,小D也迷上了麻将这个老少皆宜的游戏. 小D觉得这些不同规则的麻将太麻烦了,所以他集合了很多种麻将规则创造出了一套D麻将.下面是D麻将的几个特点: ...