题:

  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. 将本地镜像上传到Docker镜像仓库

    ⒈在Docker Hub(Docker官方镜像仓库)注册自己的用户名. ⒉在Docker中使用docker login命令登录自己的用户名密码. ⒊使用docker push 镜像名称 上传本地镜像到 ...

  2. Spring的四种事务特性,五种隔离级别,七种传播行为

    Spring事务: 什么是事务: 事务逻辑上的一组对数据对操作,组成这些操作的各个逻辑单元,要么一起成功,要么一起失败. 事务特性(4种): 原子性(atomicity):强调事务的不可分割:一致性( ...

  3. luogu P3959(2017noipTG D2T2

    luogu P3959(2017noipTG D2T2 不知道为什么,这两天见了好多伪装成图的dp题,这道也是. 最短路只有40分,实际上可以从数据范围n<=12看出来是状压dp. soluti ...

  4. 【hash】A Horrible Poem

    [题目链接] # 10038. 「一本通 2.1 练习 4」A Horrible Poem [参考博客] A Horrible Poem (字符串hash+数论) [题目描述] 给出一个由小写英文字母 ...

  5. k8s遇坑:The connection to the server k8s-api.virtual.local:6443 was refused - did you specify the right host or port?

    k8s坑The connection to the server localhost:8080 was refused - did you specify the right host or port ...

  6. 算法:二叉树的层次遍历(递归实现+非递归实现,lua)

    二叉树知识参考:深入学习二叉树(一) 二叉树基础 递归实现层次遍历算法参考:[面经]用递归方法对二叉树进行层次遍历 && 二叉树深度 上面第一篇基础写得不错,不了解二叉树的值得一看. ...

  7. 《深入理解 Java 虚拟机》学习笔记 -- 内存区域

    <深入理解 Java 虚拟机>学习笔记 -- 内存区域 运行时数据区域 主要分为 6 部分: 程序计数器 虚拟机栈 本地方法栈 Java 堆 方法区 如图所示: 1. 程序计数器(线程私有 ...

  8. JS实现带省略号的长分页显示

    // 刷新|生成分页信息 function refreshPageInfo(data, pageIndex) { var pageSize = data.pageCount pagingInfo.ht ...

  9. c# 后台隐式使用webBrowser

    c#不使用 webBrowser 控件, 在后台加载html流 private void button1_Click(object sender, EventArgs e) { string urlP ...

  10. ef core schema 指定架构

    不知道很少使用Schema模型还是怎么,居然搜帖子没人说,虽然很简单但是还是想记录一下坑 命名空间 using System.ComponentModel.DataAnnotations.Schema ...