URAL - 1486 二维字符串HASH
题目链接:http://acm.timus.ru/problem.aspx?space=1&num=1486
题意:给定一个n*m的字符矩阵,问你是否存在两个不重合(可以有交集)的正方形矩阵完全一致, 存在输出正方形的最大边长和两个正方形的左上角坐标,不存在则输出0
思路:二维字符串Hash,二分正方形的长度,然后Hash判断即可。
#define _CRT_SECURE_NO_DEPRECATE
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<string>
#include<map>
#include<vector>
#include<time.h>
#include<stack>
#include<cmath>
using namespace std;
typedef long long int LL;
typedef unsigned long long int ULL;
const int MAXN = + ;
const ULL pr = ;
const ULL pc = ;
char str[MAXN][MAXN];
pair<int, int>ans1, ans2;
map<ULL, pair<int, int>>mp;
ULL Hash[MAXN][MAXN];
bool check(int n,int m,int x){
mp.clear();
ULL t1 = ;
for (int i = ; i < x; i++){
t1 *= pr;
}
for (int i = ; i < n; i++){
ULL e = ;
for (int j = ; j < x; j++){
e = e*pr + (str[i][j] - 'a');
}
for (int j = ; j + x <= m; j++){
Hash[i][j] = e;
if (j + x < m){
e = e*pr - t1*(str[i][j] - 'a') + (str[i][j + x] - 'a');
}
}
} ULL t2 = ;
for (int i = ; i < x; i++){
t2 *= pc;
}
for (int j = ; j+x <= m; j++){
ULL e = ;
for (int i = ; i < x; i++){
e = e*pc + Hash[i][j];
}
for (int i = ; i + x <= n; i++){
if (mp.find(e) != mp.end()){
ans1 = mp[e];
ans2.first = i, ans2.second = j;
return true;
}
mp.insert(make_pair(e, make_pair(i, j)));
if (i + x < n){
e = e*pc - t2*Hash[i][j] + Hash[i + x][j];
}
}
}
return false;
}
int main(){
//#ifdef kirito
// freopen("in.txt", "r", stdin);
// freopen("out.txt", "w", stdout);
//#endif
// int start = clock();
int n, m;
while (~scanf("%d%d", &n,&m)){
for (int i = ; i < n; i++){
scanf("%s", str[i]);
}
int l = , r = min(n, m), mid;
while (r >= l){
mid = (r + l) >> ;
if (check(n,m,mid)){
l = mid + ;
}
else{
r = mid - ;
}
}
if (r&&check(n,m,r)){
printf("%d\n", r);
printf("%d %d\n", ans1.first + , ans1.second + );
printf("%d %d\n", ans2.first + , ans2.second + );
}
else{
printf("0\n");
}
}
//#ifdef LOCAL_TIME
// cout << "[Finished in " << clock() - start << " ms]" << endl;
//#endif
return ;
}
URAL - 1486 二维字符串HASH的更多相关文章
- 2018/7/31-zznuoj-问题 A: A + B 普拉斯【二维字符串+暴力模拟+考虑瑕疵的题意-0的特例】
问题 A: A + B 普拉斯 在计算机中,数字是通过像01像素矩阵来显示的,最终的显示效果如下: 现在我们用01来构成这些数字 当宝儿姐输入A + B 时(log10(A)<50,log10 ...
- 计算机二级-C语言-程序填空题-190109记录-对二维字符串数组的处理
//给定程序,函数fun的功能是:求出形参ss所指字符串数组中最长字符串的长度,将其余字符串右边用字符*补齐,使其与最长的字符串等长.ss所指字符串数组中共有M个字符串,且串长<N. //重难点 ...
- UVA - 11019 Matrix Matcher (二维字符串哈希)
给你一个n*m的矩阵,和一个x*y的模式矩阵,求模式矩阵在原矩阵中的出现次数. 看上去是kmp在二维情况下的版本,但单纯的kmp已经无法做到了,所以考虑字符串哈希. 类比一维情况下的哈希算法,利用容斥 ...
- 牛客网训练1--------矩阵 (二份+二维矩阵hash)
不懂hash的话:https://www.cnblogs.com/ALINGMAOMAO/p/10345850.html 思路:对于一个大矩阵的每一个子矩阵都对应着一个hash值k, 当k出现2次以上 ...
- pku1204 Word Puzzles AC自动机 二维字符串矩阵8个方向找模式串的起点坐标以及方向 挺好的!
/** 题目:pku1204 Word Puzzles 链接:http://poj.org/problem?id=1204 题意:给定一个L C(C <= 1000, L <= 1000) ...
- 【总结】字符串hash
序列字符串\(Hash\) 直接hash即可qwq 预处理:\(Hash[3][i]\)(\(Hash\)值),\(Pow[3][i]\)(用来乘系数) 判断相等:\(box_1=Hash[3][i] ...
- 【URAL 1486】Equal Squares
题意:求给定字符矩阵中相同正方形矩阵的最大边长和这两个相同正方形的位置 第一次写字符串哈希,选两个不同的模数进行二维字符串哈希. 本来应该取模判断相等后再暴力扫矩阵来判断,但是我看到<Hash在 ...
- 【C语言入门教程】4.2 二维数组
C 语言允许使用多维数组,即使用多组小标的数组,二维数组是最常用的多维数组.多维数组在内存中存放数据的顺序与一维数组相同,使用连续的存储单元. 4.2.1 二维数组的一般形式 二维数组的一般声明形式为 ...
- 字符串HASH 学习总结 && 模板
一.字符串HASH模板 取自挑战程序设计竞赛(第2版) </pre><pre code_snippet_id="446698" snippet_file_nam ...
随机推荐
- [BZOJ1826] 缓存交换
问题描述 在计算机中,CPU只能和高速缓存Cache直接交换数据.当所需的内存单元不在Cache中时,则需要从主存里把数据调入Cache.此时,如果Cache容量已满,则必须先从中删除一个. 例如,当 ...
- Centos7硬盘空间扩容(vmware虚拟机)
1. 查看系统挂载点 df -h 2. 系统关机 init 0 硬盘1空间修改为100G,保存并启动 3.查看磁盘 fdisk -l /dev/sda空间加上去了 3. 硬盘分区 fdisk /dev ...
- [LeetCode] 238. 除自身以外数组的乘积 ☆☆☆(左积*右积)
描述 给定长度为 n 的整数数组 nums,其中 n > 1,返回输出数组 output ,其中 output[i] 等于 nums 中除 nums[i] 之外其余各元素的乘积. 示例: 输入: ...
- 吐血整理 | 1000行MySQL学习笔记,不怕你不会,就怕你不学!
/ Windows服务 / / 连接与断开服务器 / / 数据库操作 / ------------------ / 表的操作 / ------------------ / 数据操作 / ------- ...
- Largest Point
Largest Point Time Limit: 1500/1000 MS (Java/Others) Memory Limit: 65535/32768 K (Java/Others)Tot ...
- eclipse中maven工程添加本地库至Maven Dependencies
1.WEB-INF文件夹下添加lib文件夹,文件夹下添加demo-client-0.1-SNAPSHOT.jar 2.pom.xml中配置如下代码: <dependency> <gr ...
- Hibernate入门学习笔记
1.Hibernate是什么? 2.hibernate怎么配置? 3.SessionFactory是干什么的?有哪些方法经常用? 4.hibernate的现成的增删改查方法怎么使用?都有哪些方法?哪些 ...
- T2691 桶哥的问题——送桶
这个题其实不难,就是按照结束时候的顺序从大到小走一遍,能送的就送,如果区间不重合就更新一下 代码: #include<iostream> #include<cstdio> #i ...
- 移动端调试 — chrome模拟器基础调试
打开开发者工具,进入chrome调试状态,点击左上角的手机图标,进入手机模拟器调试状态. 模拟器支持操作: 切换设备类型,模拟网络环境,模拟bar,keyboard弹出状态,横屏状态,更改UserAg ...
- JS-让浏览器兼容ES6特性
babel:将 ES6 翻译为 ES5 PS:ie 还不支持 import 和 export 还是用 gulp 打包一下吧