每个 UCloud 用户会构造一个由数字序列组成的秘钥,用于对服务器进行各种操作。作为一家安全可信的云计算平台,秘钥的安全性至关重要。因此,UCloud 每年会对用户的秘钥进行安全性评估,具体的评估方法如下:

首先,定义两个由数字序列组成的秘钥 aa 和 bb近似匹配(\approx≈) 的关系。aa 和 bb 近似匹配当且仅当同时满足以下两个条件:

  • |a|=|b|∣a∣=∣b∣,即 aa 串和 bb 串长度相等。
  • 对于每种数字 cc,cc 在 aa 中出现的次数等于 cc 在 bb 中出现的次数。

此时,我们就称 aa 和 bb 近似匹配,即 a \approx ba≈b。例如,(1,3,1,1,2)\approx(2,1,3,1,1)(1,3,1,1,2)≈(2,1,3,1,1)。

UCloud 每年会收集若干不安全秘钥,这些秘钥组成了不安全秘钥集合 TT。对于一个秘钥 ss 和集合 TT 中的秘钥 tt 来说,它们的相似值定义为:ss 的所有连续子串中与 tt 近似匹配的个数。相似值越高,说明秘钥 ss 越不安全。对于不安全秘钥集合 TT 中的每个秘钥 tt,你需要输出它和秘钥 ss 的相似值,用来对用户秘钥的安全性进行分析。

输入格式

第一行包含一个正整数 nn,表示 ss 串的长度。

第二行包含 nn 个正整数 s_1,s_2,...,s_n(1\leq s_i\leq n)s​1​​,s​2​​,...,s​n​​(1≤s​i​​≤n),表示 ss 串。

接下来一行包含一个正整数 mm,表示询问的个数。

接下来 mm 个部分:

每个部分第一行包含一个正整数 k(1\leq k\leq n)k(1≤k≤n),表示每个 tt 串的长度。

每个部分第二行包含 kk 个正整数 t_1,t_2,...,t_k(1\leq t_i\leq n)t​1​​,t​2​​,...,t​k​​(1≤t​i​​≤n),表示 TT 中的一个串 tt。

输入数据保证 TT 中所有串长度之和不超过 200000200000。

对于简单版本:1\leq n,m\leq 1001≤n,m≤100;

对于中等版本:1\leq n\leq 50000,1\leq m\leq 5001≤n≤50000,1≤m≤500;

对于困难版本:1 \le n \le 50000, 1 \le m \le 1000001≤n≤50000,1≤m≤100000。

输出格式

输出 mm 行,每行一个整数,即与 TT 中每个串 tt近似匹配的 ss 的子串数量。

样例解释

对于第一个询问,(3,2,1,3)\approx(2,3,1,3)(3,2,1,3)≈(2,3,1,3),(3,2,1,3)\approx(3,1,3,2)(3,2,1,3)≈(3,1,3,2);

对于第二个询问,(1,3)\approx(3,1)(1,3)≈(3,1),(1,3)\approx(1,3)(1,3)≈(1,3);

对于第三个询问,(3,2)\approx(2,3)(3,2)≈(2,3),(3,2)\approx(3,2)(3,2)≈(3,2)。

样例输入

5
2 3 1 3 2
3
4
3 2 1 3
2
1 3
2
3 2

样例输出

2
2
2

对于每个询问
实际上我们的想法是能通过类似尺取的方式,将每一个长度为len的区间取出来,能hash出来,O(1)查询hash值,从而做到查询O(n*m)
实际上这个hash没想出来,但是这里有一种巧妙的尺取法,
对于每个询问,我们记录下每种数字的个数,标记数组是这样一个东西

(下面这个v数组就像游标一样,再加上我用了尺取法,所以就起名叫尺取游标法啦

如果t串中1的个数比s的某一子串多那么v[1]>0

如果比它少就小于零,|v[1]|代表相差元素个数

我们记录一下t串中v[]不为零的个数cnt

则当且仅当某串的各串数量和t串相等时,cnt为0

简单考虑几种情况,某串种类比t多,cnt肯定会变大

某串的种类比t少,cnt可能变大也可能变小,但不为0,具体要看每种的数量

某串种类和t相等,但某类数字出现过多或过少,cnt不为0

所以我们发现动态维护cnt是可行的

区间滑动改变一个左端点,改变一个右端点,动态维护v数组,并且根据v修改cnt

如果cnt为0一次,那么对答案的贡献加一

#include <stdio.h>
#include <cstring>
#include <vector>
#include <map>
using namespace std;
const int maxn=5e4+7;
typedef long long ll;
int s[maxn],t[maxn],ns,nt,m,v[maxn];
int main(){
scanf("%d",&ns);
for(int i=0;i<ns;++i) scanf("%d",s+i);
scanf("%d",&m);
while(m--){
scanf("%d",&nt);
for(int i=0;i<nt;++i) scanf("%d",t+i);
memset(v,0,sizeof(v));
int cnt=0;
for(int i=0;i<nt;++i){
v[t[i]]++;
if(v[t[i]]==1) cnt++;
}
for(int i=0;i<nt;++i){
if(v[s[i]]==0) cnt++;
else if(v[s[i]]==1) cnt--;
v[s[i]]--;
}
int ans=0,l=1,r=nt;
if(!cnt) ans++;
while(r<ns){
if(v[s[r]]==0) cnt++;
else if(v[s[r]]==1) cnt--;
v[s[r]]--;
if(v[s[l-1]]==-1) cnt--;
else if(v[s[l-1]]==0) cnt++;
v[s[l-1]]++;
if(!cnt) ans++;
l++;r++;
}
printf("%d\n",ans);
}
return 0;
}

计蒜客第五场 UCloud 的安全秘钥(中等) (尺取游标法的更多相关文章

  1. 计蒜客-第五场初赛-第二题 UCloud 的安全秘钥(简单)

    每个 UCloud 用户会构造一个由数字序列组成的秘钥,用于对服务器进行各种操作.作为一家安全可信的云计算平台,秘钥的安全性至关重要.因此,UCloud 每年会对用户的秘钥进行安全性评估,具体的评估方 ...

  2. 2017 计蒜之道 初赛 第五场 UCloud 的安全秘钥(中等)

    每个 UCloud 用户会构造一个由数字序列组成的秘钥,用于对服务器进行各种操作.作为一家安全可信的云计算平台,秘钥的安全性至关重要.因此,UCloud 每年会对用户的秘钥进行安全性评估,具体的评估方 ...

  3. 计蒜客 第四场 C 商汤科技的行人检测(中等)平面几何好题

    商汤科技近日推出的 SenseVideo 能够对视频监控中的对象进行识别与分析,包括行人检测等.在行人检测问题中,最重要的就是对行人移动的检测.由于往往是在视频监控数据中检测行人,我们将图像上的行人抽 ...

  4. (计蒜客)UCloud 的安全秘钥

    UCloud 的安全秘钥 题意 给出一个数组 s 串,和数组 t 串,那么如果两者长度相同且两者所含的数字全部相同,则说这两个串相似. 给定原始串 S ,以及 m 个询问 T 串,问 S 串有多少个连 ...

  5. 计蒜客 UCloud 的安全秘钥(困难)(哈希)

    UCloud 的安全秘钥(困难) 编辑代码 9.53% 1200ms 262144K 每个 UCloud 用户会构造一个由数字序列组成的秘钥,用于对服务器进行各种操作.作为一家安全可信的云计算平台,秘 ...

  6. 计蒜客 UCloud 的安全秘钥(随机化+Hash)

    题目链接 UCloud 的安全秘钥 对于简单的版本,我们直接枚举每个子序列,然后sort一下判断是否完全一样即可. #include <bits/stdc++.h> using names ...

  7. 计蒜客模拟赛5 D2T1 成绩统计

    又到了一年一度的新生入学季了,清华和北大的计算机系同学都参加了同一场开学考试(因为两校兄弟情谊深厚嘛,来一场联考还是很正常的). 不幸的是,正当老师要统计大家的成绩时,世界上的所有计算机全部瘫痪了. ...

  8. 计蒜客 31434 - 广场车神 - [DP+前缀和]

    题目链接:https://nanti.jisuanke.com/t/31434 小 D 是一位著名的车手,他热衷于在广场上飙车.每年儿童节过后,小 D 都会在广场上举行一场别样的车技大赛. 小 D 所 ...

  9. 计蒜客 28449.算个欧拉函数给大家助助兴-大数的因子个数 (HDU5649.DZY Loves Sorting) ( ACM训练联盟周赛 G)

    ACM训练联盟周赛 这一场有几个数据结构的题,但是自己太菜,不会树套树,带插入的区间第K小-替罪羊套函数式线段树, 先立个flag,BZOJ3065: 带插入区间K小值 计蒜客 Zeratul与Xor ...

随机推荐

  1. STGAN: A Unified Selective Transfer Network for Arbitrary Image Attribute Editing 阅读笔记和pytorch代码解读

    一.论文采用的新方法 1.AttGan中skip connect的局限性 由于encoder中对特征的下采样实际上可能损失部分特征,我们在decoder中进行上采样和转置卷积也无法恢复所有特征,因此A ...

  2. Django前后端分离项目部署

    vue+drf的前后端分离部署笔记 前端部署过程 端口划分: vue+nginx的端口 是81 vue向后台发请求,首先发给的是代理服务器,这里模拟是nginx的 9000 drf后台运行在 9005 ...

  3. Py第一次练习,第二次练习

    有两个列表      l1 = [11,22,33]        l2 = [22,33,44] 1.获取内容相同的元素列表2.获取l1中有l2中没有的元素列表3.获取l1和l2中不同的元素列表 l ...

  4. 基于源码分析Vue的nextTick

    摘要:本文通过结合官方文档.源码和其他文章整理后,对Vue的nextTick做深入解析.理解本文最好有浏览器事件循环的基础,建议先阅读上文<事件循环Event loop到底是什么>. 一. ...

  5. Hmailserver搭建邮箱服务器

    由于阿里云,谷歌云,腾讯云等服务器都不开放25端口和pop3端口,想要使用邮箱服务得购买他们的企业邮箱,但是对于个人而言比较贵. 所以我们需要利用家庭宽带申请公网IP. 首先打电话给运营商客服,申请动 ...

  6. Map类型数据导出Excel--poi

    https://blog.csdn.net/KevinChen2019/article/details/101064790 <dependency> <groupId>org. ...

  7. springBoot controller入参LocalDateTime

    @JsonFormat(shape = JsonFormat.Shape.STRING, pattern="yyyy-MM-dd HH:mm:ss") @DateTimeForma ...

  8. 【Android初级】教你用两行代码实现“显示/隐藏密码”的效果

    Android里面要使用密码的场景是非常多的,支付宝.微信.淘宝以及各大银行APP,都跟用户的密码有关.用户的密码是极为隐私的,用户在输入时不希望密码被别人看到,所以几乎所有需要输入密码的场景下都会把 ...

  9. 使用session实现网站N天免登陆()

    问题描述: 一些网站的N天之内免登陆实现方式. 方式一: 首先想到的是使用cookie保存用户登录信息,设置有效期,在用户下次访问时免去登录环节,直接通过cookie获取用户信息. 方式二: 方式二: ...

  10. Django(orm)转

    转载自 https://www.jianshu.com/p/d92ecd3644f7?utm_campaign=hugo&utm_medium=reader_share&utm_con ...