题目链接:http://acm.timus.ru/problem.aspx?space=1&num=1486

题意:给定一个n*m的字符矩阵,问你是否存在两个不重合(可以有交集)的正方形矩阵完全一致, 存在输出正方形的最大边长和两个正方形的左上角坐标,不存在则输出0

思路:二维字符串Hash,二分正方形的长度,然后Hash判断即可。

  1. #define _CRT_SECURE_NO_DEPRECATE
  2. #include<iostream>
  3. #include<cstdio>
  4. #include<cstring>
  5. #include<algorithm>
  6. #include<string>
  7. #include<map>
  8. #include<vector>
  9. #include<time.h>
  10. #include<stack>
  11. #include<cmath>
  12. using namespace std;
  13. typedef long long int LL;
  14. typedef unsigned long long int ULL;
  15. const int MAXN = + ;
  16. const ULL pr = ;
  17. const ULL pc = ;
  18. char str[MAXN][MAXN];
  19. pair<int, int>ans1, ans2;
  20. map<ULL, pair<int, int>>mp;
  21. ULL Hash[MAXN][MAXN];
  22. bool check(int n,int m,int x){
  23. mp.clear();
  24. ULL t1 = ;
  25. for (int i = ; i < x; i++){
  26. t1 *= pr;
  27. }
  28. for (int i = ; i < n; i++){
  29. ULL e = ;
  30. for (int j = ; j < x; j++){
  31. e = e*pr + (str[i][j] - 'a');
  32. }
  33. for (int j = ; j + x <= m; j++){
  34. Hash[i][j] = e;
  35. if (j + x < m){
  36. e = e*pr - t1*(str[i][j] - 'a') + (str[i][j + x] - 'a');
  37. }
  38. }
  39. }
  40.  
  41. ULL t2 = ;
  42. for (int i = ; i < x; i++){
  43. t2 *= pc;
  44. }
  45. for (int j = ; j+x <= m; j++){
  46. ULL e = ;
  47. for (int i = ; i < x; i++){
  48. e = e*pc + Hash[i][j];
  49. }
  50. for (int i = ; i + x <= n; i++){
  51. if (mp.find(e) != mp.end()){
  52. ans1 = mp[e];
  53. ans2.first = i, ans2.second = j;
  54. return true;
  55. }
  56. mp.insert(make_pair(e, make_pair(i, j)));
  57. if (i + x < n){
  58. e = e*pc - t2*Hash[i][j] + Hash[i + x][j];
  59. }
  60. }
  61. }
  62. return false;
  63. }
  64. int main(){
  65. //#ifdef kirito
  66. // freopen("in.txt", "r", stdin);
  67. // freopen("out.txt", "w", stdout);
  68. //#endif
  69. // int start = clock();
  70. int n, m;
  71. while (~scanf("%d%d", &n,&m)){
  72. for (int i = ; i < n; i++){
  73. scanf("%s", str[i]);
  74. }
  75. int l = , r = min(n, m), mid;
  76. while (r >= l){
  77. mid = (r + l) >> ;
  78. if (check(n,m,mid)){
  79. l = mid + ;
  80. }
  81. else{
  82. r = mid - ;
  83. }
  84. }
  85. if (r&&check(n,m,r)){
  86. printf("%d\n", r);
  87. printf("%d %d\n", ans1.first + , ans1.second + );
  88. printf("%d %d\n", ans2.first + , ans2.second + );
  89. }
  90. else{
  91. printf("0\n");
  92. }
  93. }
  94. //#ifdef LOCAL_TIME
  95. // cout << "[Finished in " << clock() - start << " ms]" << endl;
  96. //#endif
  97. return ;
  98. }

URAL - 1486 二维字符串HASH的更多相关文章

  1. 2018/7/31-zznuoj-问题 A: A + B 普拉斯【二维字符串+暴力模拟+考虑瑕疵的题意-0的特例】

    问题 A: A + B 普拉斯 在计算机中,数字是通过像01像素矩阵来显示的,最终的显示效果如下:  现在我们用01来构成这些数字 当宝儿姐输入A + B 时(log10(A)<50,log10 ...

  2. 计算机二级-C语言-程序填空题-190109记录-对二维字符串数组的处理

    //给定程序,函数fun的功能是:求出形参ss所指字符串数组中最长字符串的长度,将其余字符串右边用字符*补齐,使其与最长的字符串等长.ss所指字符串数组中共有M个字符串,且串长<N. //重难点 ...

  3. UVA - 11019 Matrix Matcher (二维字符串哈希)

    给你一个n*m的矩阵,和一个x*y的模式矩阵,求模式矩阵在原矩阵中的出现次数. 看上去是kmp在二维情况下的版本,但单纯的kmp已经无法做到了,所以考虑字符串哈希. 类比一维情况下的哈希算法,利用容斥 ...

  4. 牛客网训练1--------矩阵 (二份+二维矩阵hash)

    不懂hash的话:https://www.cnblogs.com/ALINGMAOMAO/p/10345850.html 思路:对于一个大矩阵的每一个子矩阵都对应着一个hash值k, 当k出现2次以上 ...

  5. pku1204 Word Puzzles AC自动机 二维字符串矩阵8个方向找模式串的起点坐标以及方向 挺好的!

    /** 题目:pku1204 Word Puzzles 链接:http://poj.org/problem?id=1204 题意:给定一个L C(C <= 1000, L <= 1000) ...

  6. 【总结】字符串hash

    序列字符串\(Hash\) 直接hash即可qwq 预处理:\(Hash[3][i]\)(\(Hash\)值),\(Pow[3][i]\)(用来乘系数) 判断相等:\(box_1=Hash[3][i] ...

  7. 【URAL 1486】Equal Squares

    题意:求给定字符矩阵中相同正方形矩阵的最大边长和这两个相同正方形的位置 第一次写字符串哈希,选两个不同的模数进行二维字符串哈希. 本来应该取模判断相等后再暴力扫矩阵来判断,但是我看到<Hash在 ...

  8. 【C语言入门教程】4.2 二维数组

    C 语言允许使用多维数组,即使用多组小标的数组,二维数组是最常用的多维数组.多维数组在内存中存放数据的顺序与一维数组相同,使用连续的存储单元. 4.2.1 二维数组的一般形式 二维数组的一般声明形式为 ...

  9. 字符串HASH 学习总结 &amp;&amp; 模板

    一.字符串HASH模板  取自挑战程序设计竞赛(第2版) </pre><pre code_snippet_id="446698" snippet_file_nam ...

随机推荐

  1. Java技术中如何使用keepalived实现双机热备

    Keepalived简介 Keepalived是Linux下一个轻量级别的高可用解决方案.高可用(High Avalilability,HA),其实两种不同的含义:广义来讲,是指整个系统的高可用行,狭 ...

  2. Python---编辑器安装和print函数

    Python---编辑器安装和print函数 -------------------------------------------------------- 一.Python是什么? Python是 ...

  3. linux运维、架构之路-SaltStack快速入门

    一.SaltStack介绍        SaltStack是一个服务器基础架构集中化管理平台,SaltStack基于Python语言实现,也是基于C/S架构,结合轻量级消息队列(ZeroMQ)与Py ...

  4. UIWebView和WKWebView一些琐事

    WebViewJavascriptBridge 1.load加载 ,去本地查找html路径方式 NSString* htmlPath = [[NSBundle mainBundle] pathForR ...

  5. 最最简单的spring mvc + Maven项目

    首先配置pom文件,只需要引用三个jar包文件即可: <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi ...

  6. 安卓环境home assistant搭建

    准备搞个智能家居玩玩 先从home assistant(后面简写为HASS)开始吧 莫得树莓派,拿旧手机凑活一下 准备材料: root过的安卓机 一.安卓机Linux环境搭建 个人习惯不详细写基础环境 ...

  7. 【HDOJ6614】AND Minimum Spanning Tree(签到)

    题意:给定标号从1到n的n个点,链接两个点x,y的代价为x AND y,求最小生成树总代价与满足代价最小的前提下字典序最小的方案 n<=2e5 思路: #include<bits/stdc ...

  8. 27 August

    高精度 struct bigint{ int a[1000],an; bigint operator = (int b){ an=0; while (b){a[an++]=b%10;b/=10;} r ...

  9. 阿里云code下载代码和更新代码

    1- 本地新建一个文件夹,进入文件夹下面右击打开git 2- Git init初始化一个.git文件夹 3- Git clone git@code.aliyun.com:username/space- ...

  10. python中生成器generator

    通过列表生成式,我们可以直接创建一个列表.但是,受到内存限制,列表容量肯定是有限的.而且,创建一个包含100万个元素的列表,不仅占用很大的存储空间,如果我们仅仅需要访问前面几个元素,那后面绝大多数元素 ...