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 ...
随机推荐
- # [洛谷1337] 吊打XXX/平衡点 (模拟退火)
[洛谷1337] 吊打XXX/平衡点 (模拟退火) 题意 n个重物(x,y,w),求平衡时x的位置(x,y) 分析 模拟退火基础题,基于随机数的优化算法,时间复杂度玄学,参数玄学,能不能AC看脸,当然 ...
- localStorage 杂记
localStorage html5标准 Web 存储现在的主流浏览器,包括IE 8+.Chrome 4+.Firefox 3.5+.Opera 10.5+.Safari 4+.iPhone 2+.A ...
- python不同编码方式对应所占字节数
不同编码方式对应所占字节数 ASCII码中,一个英文字母(不分大小写)占一个字节的空间,一个中文汉字占两个字节的空间.一个二进制数字序列,在计算机中作为一个数字单元,一般为8位二进制数,换算为十进制. ...
- 【IntelliJ IDEA】tomcat启动,打印日志乱码问题 【最新解决方法请看最后附录】
刚开始给idea上配置了一个tomcat,然后跟着http://wiki.jikexueyuan.com/project/intellij-idea-tutorial/theme-settings.h ...
- hdu 1215 求约数和 唯一分解定理的基本运用
http://acm.hdu.edu.cn/showproblem.php?pid=1215 题意:求解小于n的所有因子和 利用数论的唯一分解定理. 若n = p1^e1 * p2^e2 * ……*p ...
- A Pythonic Card Deck: __len__ & __getitem__ & for 循环的嵌套
1. 列表生成式的嵌套 for 循环: 示例如下: li1 = range(1,6) li2 = list("ABC") # list("ABC") 的结果为 ...
- 异常-Throwable的几个常见方法
package cn.itcast_04; import java.text.ParseException; import java.text.SimpleDateFormat; import jav ...
- centos 配置mysql主从复制
mysql+centos7+主从复制 MYSQL(mariadb) MariaDB数据库管理系统是MySQL的一个分支,主要由开源社区在维护,采用GPL授权许可.开发这个分支的原因之一是:甲骨文公 ...
- 【Swift后台】目录
背景介绍 环境安装
- 02-【servlet】
1.什么是Servlet Servlet是JavaWeb的三大组件之一[Servlet,Filter,Listener],它属于动态资源.Servlet的作用是处理请求,服务器会把接收到的请求交给Se ...