计蒜客 UCloud 的安全秘钥 ——(hash)
2024-09-01 09:47:54
题目链接:https://nanti.jisuanke.com/t/15769。
题意是求可以变换位置以后相同的子串有多少个,那么做法是只要每个数字的平方和,立方和以及四次方和都相同就可以了。
代码如下:
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <map>
using namespace std;
typedef long long LL;
typedef pair <LL, LL> PII;
const int N = 5e4 + ;
const int M = 1e5 + ;
const int DX = ;
int n, m;
LL s[N], pre2[N], pre3[N], pre4[N];
int vism[M];
int mp[M];
LL mm2[M], mm3[M], mm4[M];
int len[M];
LL nn[][N];
int tot;
int main(){
scanf("%d", &n);
for(int i = ; i <= n; ++ i){
scanf("%lld", &s[i]);
pre2[i] = pre2[i-] + s[i]*s[i];
pre3[i] = pre3[i-] + s[i]*s[i]*s[i];
pre4[i] = pre4[i-] + s[i]*s[i]*s[i]*s[i];
}
scanf("%d", &m);
LL t;
for(int i = ; i <= m; ++ i){
scanf("%d", &len[i]);
vism[len[i]] = ;
for(int j = ; j < len[i]; ++ j){
scanf("%lld", &t);
mm2[i] += t*t;
mm3[i] += t*t*t;
mm4[i] += t*t*t*t;
}
}
for(int i = ; i < M; ++ i){
if(vism[i]){
for(int j = i; j <= n; ++ j){
nn[tot][j-i] = (((pre4[j] - pre4[j-i]) << DX) << DX) + ((pre3[j] - pre3[j-i]) << DX) + (pre2[j] - pre2[j-i]);
}
sort(nn[tot], nn[tot] + n-i+);
mp[i] = tot ++;
}
}
LL tmp, p;
for(int i = ; i <= m; ++ i){
tmp = ((mm4[i] << DX) << DX) + (mm3[i] << DX) + mm2[i];
p = mp[len[i]];
printf("%d\n", upper_bound(nn[p], nn[p]+n-len[i]+, tmp) - lower_bound(nn[p], nn[p]+n-len[i]+, tmp));
}
}
需要注意的是,所有串的长度不超过2e5,那么tot的个数不会太多,因为不同长度种类的个数从1开始,那么到不了几百,他们的累和就会超过2e5,因此,以上算法在时间和空间上都能够承受。同时需要注意的是,仓鼠说这题卡map,因此用sort过。
最新文章
- 【Win10 应用开发】人脸识别
- #define宏定义形式的";函数";导致的bug
- 接入百度语音SDK的步骤
- Aforge.net之旅——开篇:从识别验证码开始
- jquery插件之表格隔行变色并鼠标滑过高亮显示
- visual studio code + Nodejs + Typescritpt + angularjs2 + bootstrap 环境搭建/Elementary os
- H-Basis/SG/SH GI Relighting
- 自学 iOS – 三十天三十个 Swift 项目
- mvn常见命令
- 最全的JAVA源码整合下载
- hdu 1690 The Balance_母函数
- [置顶] Android系统移植与调试之------->;如何修改Android设备状态条上音量加减键在横竖屏的时候的切换与显示
- find指令
- javaWeb学习总结(11)- 监听器(Listener)在开发中的应用
- 201521123080《Java程序设计》第6周学习总结
- 认识Json解析json生成json
- 开放接口/RESTful/Api服务的设计和安全方案详解
- AngularJS:directive自定义的指令
- Python推荐系统库--Surprise理论
- opencv学习之路(22)、轮廓查找与绘制(一)