计蒜客 UCloud 的安全秘钥 ——(hash)

  题目链接:https://nanti.jisuanke.com/t/15769

  题意是求可以变换位置以后相同的子串有多少个,那么做法是只要每个数字的平方和,立方和以及四次方和都相同就可以了。

  代码如下:

 1 #include <cstdio>
 2 #include <cstring>
 3 #include <algorithm>
 4 #include <map>
 5 using namespace std;
 6 typedef long long LL;
 7 typedef pair <LL, LL> PII;
 8 const int N = 5e4 + 5;
 9 const int M = 1e5 + 5;
10 const int DX = 3;
11 int n, m;
12 LL s[N], pre2[N], pre3[N], pre4[N];
13 int vism[M];
14 int mp[M];
15 LL mm2[M], mm3[M], mm4[M];
16 int len[M];
17 LL nn[655][N];
18 int tot;
19 int main(){
20     scanf("%d", &n);
21     for(int i = 1; i <= n; ++ i){
22         scanf("%lld", &s[i]);
23         pre2[i] = pre2[i-1] + s[i]*s[i];
24         pre3[i] = pre3[i-1] + s[i]*s[i]*s[i];
25         pre4[i] = pre4[i-1] + s[i]*s[i]*s[i]*s[i];
26     }
27     scanf("%d", &m);
28     LL t;
29     for(int i = 1; i <= m; ++ i){
30         scanf("%d", &len[i]);
31         vism[len[i]] = 1;
32         for(int j = 0; j < len[i]; ++ j){
33             scanf("%lld", &t);
34             mm2[i] += t*t;
35             mm3[i] += t*t*t;
36             mm4[i] += t*t*t*t;
37         }
38     }
39     for(int i = 1; i < M; ++ i){
40         if(vism[i]){
41             for(int j = i; j <= n; ++ j){
42                 nn[tot][j-i] = (((pre4[j] - pre4[j-i]) << DX) << DX) + ((pre3[j] - pre3[j-i]) << DX) + (pre2[j] - pre2[j-i]);
43             }
44             sort(nn[tot], nn[tot] + n-i+1);
45             mp[i] = tot ++;
46         }
47     }
48     LL tmp, p;
49     for(int i = 1; i <= m; ++ i){
50         tmp = ((mm4[i] << DX) << DX) + (mm3[i] << DX) + mm2[i];
51         p = mp[len[i]];
52         printf("%d\n", upper_bound(nn[p], nn[p]+n-len[i]+1, tmp) - lower_bound(nn[p], nn[p]+n-len[i]+1, tmp));
53     }
54 }

  需要注意的是,所有串的长度不超过2e5,那么tot的个数不会太多,因为不同长度种类的个数从1开始,那么到不了几百,他们的累和就会超过2e5,因此,以上算法在时间和空间上都能够承受。同时需要注意的是,仓鼠说这题卡map,因此用sort过。

时间: 2024-10-13 11:25:06

计蒜客 UCloud 的安全秘钥 ——(hash)的相关文章

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

题目链接 UCloud 的安全秘钥 对于简单的版本,我们直接枚举每个子序列,然后sort一下判断是否完全一样即可. #include <bits/stdc++.h> using namespace std; #define rep(i, a, b) for (int i(a); i <= (b); ++i) #define dec(i, a, b) for (int i(a); i >= (b); --i) const int N = 200010; int n; int a[N]

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

UCloud 的安全秘钥(困难) 编辑代码 9.53% 1200ms 262144K 每个 UCloud 用户会构造一个由数字序列组成的秘钥,用于对服务器进行各种操作.作为一家安全可信的云计算平台,秘钥的安全性至关重要.因此,UCloud 每年会对用户的秘钥进行安全性评估,具体的评估方法如下: 首先,定义两个由数字序列组成的秘钥 aa 和 bb 近似匹配(\approx≈) 的关系.aa 和 bb 近似匹配当且仅当同时满足以下两个条件: |a|=|b|∣a∣=∣b∣,即 aa 串和 bb 串长度

计蒜课/UCloud 的安全秘钥(hash)

题目链接:https://nanti.jisuanke.com/t/15768 题意:中文题诶- 思路:直接hash就好了,当时zz了没想到... 代码: 1 #include <iostream> 2 #include <stdio.h> 3 #define ll long long 4 using namespace std; 5 6 const int MAXN = 1e5; 7 ll a[MAXN] = {1}; 8 ll w[MAXN]; 9 10 int main(vo

2017计蒜客(四,五,六)

2017 计蒜之道 初赛 第四场 rank 178 题解 1A 1 #include <bits/stdc++.h> 2 using namespace std; 3 int n,m,k,v[110][110]; 4 void setrow(int c) 5 { 6 for(int j=1;j<=m;j++) v[c][j]=1; 7 } 8 void setcol(int c) 9 { 10 for(int j=1;j<=n;j++) v[j][c]=1; 11 } 12 int

UCloud 的安全秘钥

UCloud 的安全秘钥(困难) 1200ms 262144K 每个 UCloud 用户会构造一个由数字序列组成的秘钥,用于对服务器进行各种操作.作为一家安全可信的云计算平台,秘钥的安全性至关重要.因此,UCloud 每年会对用户的秘钥进行安全性评估,具体的评估方法如下: 首先,定义两个由数字序列组成的秘钥 aa 和 bb 近似匹配(\approx≍) 的关系.aa 和 bb 近似匹配当且仅当同时满足以下两个条件: |a|=|b|∣a∣=∣b∣,即 aa 串和 bb 串长度相等. 对于每种数字 

计蒜客 无脑博士和他的试管们

无脑博士有三个容量分别是A,B,C升的试管,A,B,C分别是三个从1到20的整数,最初,A和B试管都是空的,而C试管是装满硫酸铜溶液的.有时,无脑博士把硫酸铜溶液从一个试管倒到另一个试管中,直到被灌试管装满或原试管空了.当然每一次灌注都是完全的.由于无脑博士天天这么折腾,早已熟练,溶液在倒的过程中不会有丢失. 写一个程序去帮助无脑博士找出当A是个是空的时候,C试管中硫酸铜溶液所剩量的所有可能性. 输入包括一行,为空格分隔开的三个数,分别为整数A,B和C. 输出包括一行,升序地列出当A试管是空的时

简单斐波那契——计蒜客(4)

题目来自“计蒜客”第4题. 解算法题之前,务必先写出与之对应的数学表达式,用于描述算法. 数学描述如图: 根据“数学描述“,写出代码如下: #include <stdio.h> int main() { int N =0 ; scanf("%d", &N); int i, fn1 = 1, fn2 = 0, fn; switch(N) { case 0: printf("0"); break; case 1: printf("1&quo

计蒜客普及组模拟赛

今天没事闲的看到计蒜客有个普及组模拟赛,就当练了练手去打了,成绩低的可怜...400分崩成280分AK梦想化作泡影 第一题 同学的爱好 链接:https://nanti.jisuanke.com/t/17291 小学应用题难度?大概画个图就能懂,把每个部分都标上号,算出a,b,c,d,e,f的部分,进行运算就行了. 不多解释了,直接上代码 #include<iostream> #include<cstdio> #include<algorithm> #include&l

计蒜客 作弊揭发者(string的应用)

鉴于我市拥堵的交通状况,市政交管部门经过听证决定在道路两侧安置自动停车收费系统.当车辆驶入车位,系统会通过配有的摄像头拍摄车辆画面,通过识别车牌上的数字.字母序列识别车牌,通过连接车管所车辆信息数据库确认车辆,进行扣费. 斗智斗勇的好戏一般从此处展开… 一些车主通过在停车时遮挡车牌上的一个或多个数字.字母序列,来阻碍识别系统的识别工作,以此逃避停车费用的缴纳. 车主这简直是用轻轻的一挡搞出来一个世界难题有木有?!管理是一方面,技术解决才是王道啊. 这么难的项目不得不交给计蒜客实验室了.D 神负责