HDU 6046 - hash | 2017 Multi-University Training Contest 2
思路来自题解和一些博客
最麻烦的是样例没啥用- -
/*
HDU 6046 - hash [ hash,鸽巢 ] | 2017 Multi-University Training Contest 2
题意:
给出一个1e3*1e3的矩阵以及 一个 生成1e6*1e6的矩阵的随机函数
在1e6*1e6的矩阵中找到1e3*1e3的矩阵的位置
分析:
将1e3*1e3的矩阵每一个位置压入哈希表中,哈希值为其与之后63位所组成64位的值(不满64位就不压入)
由于 2^64 远大于 1e12 故可认为哈希值相同的是同一个位置
枚举大矩阵中的位置,若能在哈希表中找到这个位置的哈希值,则小矩阵头部的相对位置可以确定
但不需要枚举大矩阵中的每个位置,可以每隔1000行,隔900列枚举一个位置
这样根据鸽巢原理,枚举的这些位置至少有一个被小矩阵覆盖 选隔900列而不是1000列的原因是 小矩阵每行最右端63个点没被压入哈希表,所以哈希表中的矩阵是 1000 * (1000-63)的
*/
#include <bits/stdc++.h>
using namespace std;
#define LL unsigned long long
const int N = 1e3+5;
const int L = 1000;
const int ZIP = 64;
inline unsigned sfr(unsigned h, unsigned x) {
return h >> x;
}
int f(LL i, LL j) {
LL w = i * 1000000ll + j;
int h = 0;
for (int k = 0; k < 5; ++k) {
h += (int) ((w >> (8 * k)) & 255);
h += (h << 10);
h ^= sfr(h, 6);
}
h += h << 3;
h ^= sfr(h, 11);
h += h << 15;
return sfr(h, 27) & 1;
}
namespace HashMap{
const int MOD = 1313131;
struct Node {
LL pos, val;
int nxt;
}node[N*N];
int head[MOD], tot;
void init() {
memset(head, 0, sizeof(head));
tot = 0;
}
void insert(LL v, LL p) {
int t = v % MOD; tot++;
node[tot].pos = p;
node[tot].val = v;
node[tot].nxt = head[t];
head[t] = tot;
}
LL find(LL v) {
for (int i = head[v%MOD]; i; i = node[i].nxt)
if (node[i].val == v) return node[i].pos;
return 0;
}
}
char s[N];
LL hs[N];
int main()
{
int t; scanf("%d", &t);
for (int tt = 1; tt <= t; tt++)
{
HashMap::init();
for (int i = 1; i <= L; i++)
{
scanf("%s", s+1);
hs[L+1] = 0;
for (int j = L; j >= 1; j--)
hs[j] = hs[j+1]<<1|(s[j]-'0');
for (int j = 1; j <= L-ZIP+1; j++)
HashMap::insert(hs[j], i*1024+j);
}
LL ans = 0; int x, y;
for (int i = 1; i <= 1e6 && (!ans); i += 1000)
for (int j = 1; j <= 1e6 && (!ans); j += 900)
{
if (j+ZIP-1 > 1e6) continue;
LL val = 0;
for (int k = ZIP-1; k >= 0; k--)
val = val<<1|(f(i,j+k));
ans = HashMap::find(val);
if (ans != 0) x = i, y = j;
}
int px = x - ans / 1024 + 1, py = y - ans % 1024 + 1;
printf("Case #%d :%d %d\n", tt, px, py);
}
}
HDU 6046 - hash | 2017 Multi-University Training Contest 2的更多相关文章
- hdu 6046 hash
题: OwO http://acm.hdu.edu.cn/showproblem.php?pid=6046 (2017 Multi-University Training Contest - Team ...
- hdu 4930 Fighting the Landlords--2014 Multi-University Training Contest 6
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4930 Fighting the Landlords Time Limit: 2000/1000 MS ...
- HDU 6168 - Numbers | 2017 ZJUT Multi-University Training 9
/* HDU 6168 - Numbers [ 思维 ] | 2017 ZJUT Multi-University Training 9 题意: .... 分析: 全放入multiset 从小到大,慢 ...
- HDU 5726 GCD (2016 Multi-University Training Contest 1)
Time Limit: 5000MS Memory Limit: 65536KB 64bit IO Format: %I64d & %I64u Description Give y ...
- HDU 5360 Hiking(优先队列)2015 Multi-University Training Contest 6
Hiking Time Limit: 6000/3000 MS (Java/Others) Memory Limit: 131072/131072 K (Java/Others) Total S ...
- HDU OJ 4334 Trouble 2012 Multi-University Training Contest 4
题目:click here 题意: 给定5组数据,每组数据选择一个数,看是否能找到5个数的和为零. 分析: 千万不要~~T~~ 普通线性查找: #include <iostream> #i ...
- hdu 6394 Tree (2018 Multi-University Training Contest 7 1009) (树分块+倍增)
链接: http://acm.hdu.edu.cn/showproblem.php?pid=6394 思路:用dfs序处理下树,在用分块,我们只需要维护当前这个点要跳出这个块需要的步数和他跳出这个块去 ...
- HDU 4951 Multiplication table(2014 Multi-University Training Contest 8)
思路 如果进制为p 那么当x<p时 (p-1)*(p-x)=(p-(x+1)) *p +x 因为x<p 所以没有进位 所以高位上的数字为 p-(x+1). 根 ...
- HDU 4938 Seeing People(2014 Multi-University Training Contest 7)
思路:根据出发时间把点往速度反方向移动 t*v的 的距离这样就可以当成 全部点一起出发,再把y轴上的点固定不动相当于x轴的点向(-v2,v1)方向移动 .可以把所有点映射到x轴上进行统计即可(要记住同 ...
随机推荐
- AtCoder AISing Programming Contest 2019 Task D. Nearest Card Game
题目分析在代码注释里. int main() { #if defined LOCAL && !defined DUIPAI ifstream in("main.in" ...
- 20190804-Python基础 第一章
学习爬虫的同时,补充学习更多Python的基础知识,才能让所学更加扎实. 至今,所学的很多东西,基础都不牢固,导致这些所学都是浅尝则止的皮毛,不能真正上战场,故借速成之心,踏实打牢基础,举一反三,以求 ...
- [第二季ZYNQ] [南京米联]ZYNQ第二季更新完毕课程共计16节课
ZYNQ第二季更新完毕课程共计16节课全部免费 [第二季ZYNQ] ...
- select in关键字查询匹配多个字段
select id from table where (num,name) in ((num1,'name1'),(num2,'name2'))
- HTTP协议探究(四):TCP和TLS优化
一 复习与目标 1 复习 简单密码学.对称加密与非对称加密 数字签名.数字证书 SSL/TLS HTTPS = HTTP + SSL/TLS,SSL/TLS为HTTP提供了保密性.完整性和鉴别性 2 ...
- HTTP的请求方法
. OPTIONS - 获取服务器支持的HTTP请求方法: 用来检查服务器的性能.如:AJAX进行跨域请求时的预检,需要向另外一个域名的资源发送一个HTTP O ...
- 适配方案(五)适配的基础知识之设备像素比 dpr 与 1px 物理像素
设备像素比 dpr 与 1px 物理像素 物理像素(physical pixel) 手机屏幕上显示的最小单元,该最小单元具有颜色及亮度的属性可供设置,iphone6.7.8 为:750 * 1334, ...
- javaweb开发技术--监听器
监听器定义:是指专门用于其他对象身上发生的事件或状态改变进行监听和相应的处理的对象,当被监视的对象发生变化时立即采取相应的行动. web监听器的定义:servlet规范中定义的一种特殊类.用于监听Se ...
- 如何部署struts开发环境
1 首先登陆http://archive.apache.org/dist/struts/source/页面,会看到struts的下载页面 2 下载struts的最新版本struts2-2.2.1-sr ...
- .NET 反射应用
object request = null; string requestObjClassName = "命名空间" + 类型.ToString(); Type type = Ty ...