思路来自题解和一些博客

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

/*
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. hadoop(二MapReduce)

    hadoop(二MapReduce) 介绍 MapReduce:其实就是把数据分开处理后再将数据合在一起. Map负责“分”,即把复杂的任务分解为若干个“简单的任务”来并行处理.可以进行拆分的前提是这 ...

  2. Qt Pro相关

      Qt项目pro文件相关知识总结和记录 pro文件中使用相对路径需要注意的地方 INCLUDE_PATH 后接的路径./代表的是pro所在目录 LIBS 后接的./是可执行文件所在的目录,该目录会被 ...

  3. (二)springMvc 入门

    目录 配置前端控制器 servlet拦截方式 springMvc的配置文件 编写处理器类 配置自定义处理器 配置前端控制器 在 web.xml 配置 DispatcherServlet <!-- ...

  4. 剑指offer47:位运算+递归。求1+2+3+...+n,要求不能使用乘除法、for、while、if、else、switch、case等关键字及条件判断语句(A?B:C)。

    1 题目描述 求1+2+3+...+n,要求不能使用乘除法.for.while.if.else.switch.case等关键字及条件判断语句(A?B:C). 2 思路和方法 (1)递归,不能使用if等 ...

  5. python 基础(十七)--hashlib加密模块

    hashlib加密模块 两种方式使用 字符串是中文时需要先编码成utf-8 常用加密算法:md5,sha1(已被破解)等... >>> a= hashlib.md5() >&g ...

  6. tomcat 发布的web项目不在webapps目录下

    双击服务器(如果服务器再启动,请停止并删除里面的项目,再clean一下), server location 选择use tomcat installation: deploy path 改为webap ...

  7. Spring IOC Container

    All the notes are from Spring Framework 5 Doc. 一.Introduction to the Spring IOC Container and Beans ...

  8. wpf 判断项目中的某个窗体是否已经打开或者已经存在

    foreach (Window item in Application.Current.Windows) {     if (item is window1) return; }

  9. Python中异常打印——面向程序猿

    import logging # logging.disable(logging.CRITICAL) logging.basicConfig(filename="loggingBug.txt ...

  10. Python实现英文文章加密传送,收到后进行解密

    思路:将I Love You这样的字符串中的每一个字符,将他的Unicode码都就进行加或减去一个特定的数, 在传送过程中,如果被截获,获取的也是一段混乱的文章,当收到这段文章后,按相同的方式对Uni ...