思路来自题解和一些博客

最麻烦的是样例没啥用- -

/*
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的更多相关文章

  1. hdu 6046 hash

    题: OwO http://acm.hdu.edu.cn/showproblem.php?pid=6046 (2017 Multi-University Training Contest - Team ...

  2. 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 ...

  3. HDU 6168 - Numbers | 2017 ZJUT Multi-University Training 9

    /* HDU 6168 - Numbers [ 思维 ] | 2017 ZJUT Multi-University Training 9 题意: .... 分析: 全放入multiset 从小到大,慢 ...

  4. HDU 5726 GCD (2016 Multi-University Training Contest 1)

      Time Limit: 5000MS   Memory Limit: 65536KB   64bit IO Format: %I64d & %I64u Description Give y ...

  5. 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 ...

  6. HDU OJ 4334 Trouble 2012 Multi-University Training Contest 4

    题目:click here 题意: 给定5组数据,每组数据选择一个数,看是否能找到5个数的和为零. 分析: 千万不要~~T~~ 普通线性查找: #include <iostream> #i ...

  7. hdu 6394 Tree (2018 Multi-University Training Contest 7 1009) (树分块+倍增)

    链接: http://acm.hdu.edu.cn/showproblem.php?pid=6394 思路:用dfs序处理下树,在用分块,我们只需要维护当前这个点要跳出这个块需要的步数和他跳出这个块去 ...

  8. 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). 根 ...

  9. HDU 4938 Seeing People(2014 Multi-University Training Contest 7)

    思路:根据出发时间把点往速度反方向移动 t*v的 的距离这样就可以当成 全部点一起出发,再把y轴上的点固定不动相当于x轴的点向(-v2,v1)方向移动 .可以把所有点映射到x轴上进行统计即可(要记住同 ...

随机推荐

  1. (五)mybatis开发dao层

    目录 SqlSession 是线程不安全的 原始 dao 开发方法 Mapper 代理方法 关于代理对象 SqlSession 是线程不安全的 SqlSession 是 线程不安全 的: 对于它,我们 ...

  2. kafka安装、相关命令以及PHP使用

    1.安装JAVA #下载安装包 https://www.oracle.com/technetwork/java/javase/downloads/index.html tar -xzvf jdk-8u ...

  3. 用函数来编写实现strlen()函数功能

    strlen( )函数: 测试字符串实际长度的函数,它的返回值是字符串中字符的个数(不包含’\0’) //strlen( )函数:测试字符串实际长度的函数,它的返回值是字符串中字符的个数(不包含’\0 ...

  4. Codeforces 1097F. Alex and a TV Show

    传送门 由于只要考虑 $\mod 2$ 意义下的答案,所以我们只要维护一堆的 $01$ 容易想到用 $bitset$ 瞎搞...,发现当复杂度 $qv/32$ 是可以过的... 一开始容易想到对每个集 ...

  5. 3037 插板法+lucas

    先说下lucas定理 1)Lucas定理:p为素数,则有: (2)证明: n=(ak...a2,a1,a0)p = (ak...a2,a1)p*p + a0 =  [n/p]*p+a0 (注意 这里( ...

  6. .NET Core 创建Windows服务

    .NET Core 创建Windows服务 作者:高堂 原文地址:https://www.cnblogs.com/gaotang/p/10850564.html 写在前面 使用 TopShelf+Au ...

  7. arcgis js 之 渔网工具(调用地图服务)

    arcgis js 之 渔网工具(调用地图服务) 原理: 简历不同级别的网渔网图层,设置显示比例尺.然后发布服务,使用MapImageLayer接收. 过程: 1.在arcmap中用创建渔网工具将不同 ...

  8. JS 编程艺术

    JS艺术片段剪贴 getFullDate: function (date) { //返回 YYYY年MM月DD日 var year = month = day = ' '; if (isNaN(dat ...

  9. Innosetup设置控制面版中的名称显示和图标

    //设置控制面板中程序图标UninstallDisplayIcon={app}\logo.ico //设置控制面板中程序的名称Uninstallable=yesUninstallDisplayName ...

  10. java集合之hashMap,初始长度,高并发死锁,java8 hashMap做的性能提升

    众所周知,HashMap是一个用于存储Key-Value键值对的集合,每一个键值对也叫做Entry.这些个键值对(Entry)分散存储在一个数组当中,这个数组就是HashMap的主干. HashMap ...