题:

  OwO http://acm.hdu.edu.cn/showproblem.php?pid=6046

  (2017 Multi-University Training Contest - Team 2 - 1002)  

解:

  设A矩阵为1e3*1e3的那个矩阵,另一个叫B矩阵

  首先对A矩阵进行预处理,每一行中的每一个点的哈希值为这个点和其右边63个点的组合值(总计64个点)(如果右边没63个点了那就不做了),放入hashmap中

  然后对B矩阵进行扫描。

  想象把很多个A矩阵铺在B矩阵上面,使A矩阵有预处理的部分铺满B矩阵

  那么对B矩阵每1000行枚举一行,每900列枚举一列,则这些行列的交叉点钟必然有一个点存在于A矩阵中。

  由这个点的哈希值(就是前文说的该点对应的64个点的组合值)那么找出这个点,并且由hashmap得知这个点在A矩阵中的位置,就可以得知A矩阵在B矩阵中的具体位置。

  (思路来源为某其他博客)

#include <iostream>
#include <cstring>
#include <cstdio>
#include <cmath>
#include <algorithm> using namespace std; typedef unsigned long long ll; const ll hashM=1200044;
const ll hashmod=1442441;
ll hashval[hashM],hashtol;
int hashnxt[hashM],hashpos[hashM],hashid[hashmod]; void hashInit()
{
hashtol=0;
memset(hashid,0,sizeof(hashid));
} void hashInsert(ll val,int pos)
{
int tmp=val%hashmod;
hashtol++;
hashval[hashtol]=val;
hashpos[hashtol]=pos;
hashnxt[hashtol]=hashid[tmp];
hashid[tmp]=hashtol;
} int hashFindpos(ll val)
{
int tmp=val%hashmod;
for(int i=hashid[tmp];i;i=hashnxt[i])
if(hashval[i]==val)
return hashpos[i];
return -1;
} const int N=1000;
const int M=1044;
const int bas=1024;
const int cps=64;
char s[M][M]; 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;
} ll hashtmp[M]; bool check(int x0,int y0)
{
int i,j;
for(i=1;i<=N;i++)
for(j=1;j<=N;j++)
if(f(x0+i-1,y0+j-1)!=(s[i][j]-'0'))
return false;
return true;
} void solve(int cas)
{
int i,j,k,x,y,tmp,x0,y0;
ll tmpval;
for(i=0;i<1000;i++) //1000
for(j=0;j<=1111;j++) //900
{
tmpval=0;
for(k=1;k<=cps;k++)
tmpval=(tmpval<<1)+f(i*1000+1,j*900+1+k-1);
tmp=hashFindpos(tmpval);
if(tmp!=-1)
{
y=tmp%bas; x=(tmp-y)/bas;
x0=i*1000+1; y0=j*900+1;
x0-=(x-1); y0-=(y-1);
if(check(x0,y0))
{
printf("Case #%d :%d %d\n",cas,x0,y0);
return ;
}
}
}
} int main()
{
int T,tmp,i,j,k;
ll tmpval;
cin>>T;
for(int cas=1;cas<=T;cas++)
{
hashInit();
for(i=1;i<=N;i++)
scanf("%s",s[i]+1);
for(i=1;i<=N;i++)
{
hashtmp[0]=0;
for(j=1;j<=N;j++)
hashtmp[j]=(hashtmp[j-1]<<1)+(s[i][j]-'0');
for(j=1;j+cps-1<=N;j++)
hashInsert(hashtmp[j+cps-1],i*bas+j);
}
solve(cas);
}
return 0;
}

  

hdu 6046 hash的更多相关文章

  1. HDU 6046 - hash | 2017 Multi-University Training Contest 2

    思路来自题解和一些博客 最麻烦的是样例没啥用- - /* HDU 6046 - hash [ hash,鸽巢 ] | 2017 Multi-University Training Contest 2 ...

  2. hdu 5183(Hash处理区间问题)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5183 题意:给出一个n个元素的数组,现在要求判断 a1-a2+a3-a4+.....+/-an 中是否 ...

  3. hdu 5183 hash表

    BC # 32 1002 题意:给出一个数组 a 和一个数 K ,问是否存在数对( i , j ),使 a i   - a i + 1 +……+ (-1)j - i  a j : 对于这道题,一开始就 ...

  4. hdu 1856(hash+启发式并查集)

    More is better Time Limit: 5000/1000 MS (Java/Others)    Memory Limit: 327680/102400 K (Java/Others) ...

  5. hdu 1496 hash

    hash?判重,是否一样?相等?等式!没有想到,这次题做玩后,学到了HASH这一功能!当数据量在数组允许大小范围内时候即可!判断等式俩边是否相等,从而获得解的个数!从复杂度,n*m*k****,降到 ...

  6. HDU 1800 hash 找出现最多次数的字符串的次数

    乘法hash: 这类hash函数利用了乘法的不相关性 int Hash(char *str){    int seed = 131 , value=0;    while(*str != '\0'){ ...

  7. Hdu 2522 hash

    题目链接 题意:输入整数n (1<= abs(n) <= 10^5) , 输出 1/n. 这题不是自己做出来的...看了网上的思路.这种题目都能想到用hash..反正我是没往那里想,看到循 ...

  8. Hash算法入门指南(聊点不一样的算法人生)

    前言 很多人到现在为止都总是问我算法该怎么学啊,数据结构好难啊怎么的,学习难度被莫名的夸大了,其实不然.对于一个学计算机相关专业的人都知道,数据结构是大学的一门必修课,数据结构与算法是基础,却常常容易 ...

  9. hdu 5183

    hdu 5183(Hash处理区间问题) 题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5183 题意:给出一个n个元素的数组,现在要求判断 a1-a2 ...

随机推荐

  1. Oracle的查询-条件表达式

    给emp表中员工起中文名 select e.ename from emp e; select e.ename, case e.ename when 'SMITH' then '曹贼' when 'AL ...

  2. 小记--------spark的宽依赖与窄依赖分析

    窄依赖: Narrow Dependency : 一个RDD对它的父RDD,只有简单的一对一的依赖关系.RDD的每个partition仅仅依赖于父RDD中的一个partition,父RDD和子RDD的 ...

  3. 虚拟机(Vmware)安装ubuntu18.04和配置调整(三)

    三.ubuntu安装软件     1.安装常用软件 python程序员: $ sudo apt install ipython $ sudo apt install ipython3 $ sudo a ...

  4. django初步了解4

    django单表查询 必知必会13条 1.all() 查询所有 QuerySet res=models.Book.objects.all()#惰性查询 print(res) for i in res: ...

  5. 一次生产的JVM优化

    背景 生产环境有二台阿里云服务器,均为同一时期购买的,CPU.内存.硬盘等配置相同.具体配置如下: 节点 CPU 内存 硬盘 其它 A 2CPU 4G 普通云盘 Centos6.4 64位+JDK1. ...

  6. And Reachability CodeForces - 1169E (有向图可达性)

    大意: 给定序列$a$, 对所有的a[i]&a[j]>0, 从$i$向$j$连一条有向边, 给出$m$个询问$(x,y)$, 求是否能从$x$到达$y$. 裸的有向图可达性, 有向图可达 ...

  7. tensorflow零起点快速入门(1)

    导入: 其中的TF_CPP_MIN_LOG_LEVEL据说是为了忽略警告,但是我这里没有意义(numpy的一些警告) import tensorflow as tf import os os.envi ...

  8. 解决github pages和github .md文件图片不显示

    博客园上传的图片,在github上无法显示. 在github项目下建立img文件夹,放上图片 两种方式 项目绝对路径 https://raw.githubusercontent.com/用户名/项目名 ...

  9. 版本控制工具SVN学习

    教学视频链接:https://edu.aliyun.com/course/83?spm=5176.10731334.0.0.778e6580zC0Ri0 版本控制工具SVN学习 1,SVN的简介 在实 ...

  10. dev gridview拖拽数据移动

    设置属性gridView1.OptionsSelection.EnableAppearanceFocusedCell = false; //确保选定行的背景色一样. private BindingLi ...