hdu 6046 hash
题:
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的更多相关文章
- HDU 6046 - hash | 2017 Multi-University Training Contest 2
思路来自题解和一些博客 最麻烦的是样例没啥用- - /* HDU 6046 - hash [ hash,鸽巢 ] | 2017 Multi-University Training Contest 2 ...
- hdu 5183(Hash处理区间问题)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5183 题意:给出一个n个元素的数组,现在要求判断 a1-a2+a3-a4+.....+/-an 中是否 ...
- hdu 5183 hash表
BC # 32 1002 题意:给出一个数组 a 和一个数 K ,问是否存在数对( i , j ),使 a i - a i + 1 +……+ (-1)j - i a j : 对于这道题,一开始就 ...
- hdu 1856(hash+启发式并查集)
More is better Time Limit: 5000/1000 MS (Java/Others) Memory Limit: 327680/102400 K (Java/Others) ...
- hdu 1496 hash
hash?判重,是否一样?相等?等式!没有想到,这次题做玩后,学到了HASH这一功能!当数据量在数组允许大小范围内时候即可!判断等式俩边是否相等,从而获得解的个数!从复杂度,n*m*k****,降到 ...
- HDU 1800 hash 找出现最多次数的字符串的次数
乘法hash: 这类hash函数利用了乘法的不相关性 int Hash(char *str){ int seed = 131 , value=0; while(*str != '\0'){ ...
- Hdu 2522 hash
题目链接 题意:输入整数n (1<= abs(n) <= 10^5) , 输出 1/n. 这题不是自己做出来的...看了网上的思路.这种题目都能想到用hash..反正我是没往那里想,看到循 ...
- Hash算法入门指南(聊点不一样的算法人生)
前言 很多人到现在为止都总是问我算法该怎么学啊,数据结构好难啊怎么的,学习难度被莫名的夸大了,其实不然.对于一个学计算机相关专业的人都知道,数据结构是大学的一门必修课,数据结构与算法是基础,却常常容易 ...
- hdu 5183
hdu 5183(Hash处理区间问题) 题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5183 题意:给出一个n个元素的数组,现在要求判断 a1-a2 ...
随机推荐
- 【Python】【demo实验9】【练习实例】【三数排序】
原题: 输入三个整数x,y,z,请把这三个数由小到大输出. 我的解法: #!/usr/bin/python # encoding=utf-8 # -*- coding: UTF-8 -*- # 输入三 ...
- ES-基本概念
目录: 1. ElasticSearch是什么 2. 基本概念 3. 几个关键词 正文: 1. ElasticSearch是什么 ElasticSearch是一个基于Lucene的搜索 ...
- POJ - 3249 Test for Job (在DAG图利用拓扑排序中求最长路)
(点击此处查看原题) 题意 给出一个有n个结点,m条边的DAG图,每个点都有权值,每条路径(注意不是边)的权值为其经过的结点的权值之和,每条路径总是从入度为0的点开始,直至出度为0的点,问所有路径中权 ...
- 杭电2019多校第一场,Problem I,String 2019
题目描述 Tom has a string containing only lowercase letters. He wants to choose a subsequence of the str ...
- JavaWeb应用系统开发实训任务(一)
项目描述: 随着家长对孩子教育的日渐重视,社区幼儿学校在国内逐渐兴起,对社区幼儿学校的信息化管理成为迫切需求.社区幼儿学校管理系统需要实现以下功能: 1) 教师管理:实现对教师信息的查询.删除.增加 ...
- Codeforces 1238G. Adilbek and the Watering System
传送门 最关键的想法就是每个位置一定用的是当前能用的最便宜的水,因为到后面可能有更便宜的 然后其他还没用上的水我们也留着,假装此时已经买了,但是如果发现后面有更优的再反悔也不迟 每相邻两个朋友之间我们 ...
- Spring 基于 AspectJ 的 AOP 开发
Spring 基于 AspectJ 的 AOP 开发 在 Spring 的 aop 代理方式中, AspectJ 才是主流. 1. AspectJ 简介 AspectJ 是一个基于 java 语言的 ...
- 深入理解计算机系统 第十章 系统级I/O 第二遍
了解 Unix I/O 的好处 了解 Unix I/O 将帮助我们理解其他的系统概念 I/O 是系统操作不可或缺的一部分,因此,我们经常遇到 I/O 和其他系统概念之间的循环依赖.例如,I/O 在进程 ...
- 5.Hibernate 核心开发接口
一.Configuration(AnnotationConfiguration) 作用:进行配置信息的管理 目标:用来产生SessionFactory 可以在configure 方法中指定hibern ...
- java压缩下载图片并以zip流的形式下载到客户端
/** * * @param page * @param rows * @param works * @return * @author ffwwzz 下载zip * @throws IOExcept ...