链接:https://www.nowcoder.com/acm/contest/2/A
来源:牛客网

题目描述

给出一个n * m的矩阵。让你从中发现一个最大的正方形。使得这样子的正方形在矩阵中出现了至少两次。输出最大正方形的边长。

输入描述:

  1. 第一行两个整数n, m代表矩阵的长和宽;
  2. 接下来n行,每行m个字符(小写字母),表示矩阵;

输出描述:

  1. 输出一个整数表示满足条件的最大正方形的边长。

输入例子:
  1. 5 10
  2. ljkfghdfas
  3. isdfjksiye
  4. pgljkijlgp
  5. eyisdafdsi
  6. lnpglkfkjl
输出例子:
  1. 3

-->

示例1

输入

  1. 5 10
  2. ljkfghdfas
  3. isdfjksiye
  4. pgljkijlgp
  5. eyisdafdsi
  6. lnpglkfkjl

输出

  1. 3

备注:

  1. 对于30%的数据,n,m100
  2. 对于100%的数据,n,m500

题解

二分,字符串$hash$。

可以二分答案,然后验证,验证的时候$O(n^2)$效率可以得到每一个正方形的$hash$值,判断一下即可,注意$hash$冲突,用了两次$hash$才过。

  1. #include<bits/stdc++.h>
  2. using namespace std;
  3.  
  4. long long base[2];
  5. long long mod[2];
  6. const int maxn = 500 + 10;
  7. int n, m;
  8. char s[maxn][maxn];
  9. long long b[2][maxn * maxn];
  10. long long sum[2][maxn][maxn];
  11. long long h[2][maxn][maxn];
  12. pair<long long, long long> pi[maxn * maxn];
  13.  
  14. void init() {
  15. base[0] = 131LL;
  16. base[1] = 313LL;
  17. mod[0] = 1e9 + 7;
  18. mod[1] = 1e9 + 7;
  19. }
  20.  
  21. int check(int x) {
  22. for(int t = 0; t < 2; t ++) {
  23. for(int i = 0; i < n; i ++) {
  24. long long C = 0;
  25. for(int j = 0; j < x; j ++) {
  26. C = C * base[t] % mod[t];
  27. C = (C + s[i][j]) % mod[t];
  28. }
  29. sum[t][i][0] = C;
  30. for(int j = 1; j + x - 1 < m; j ++) {
  31. long long A = sum[t][i][j - 1];
  32. long long B = s[i][j - 1] * b[t][x - 1] % mod[t];
  33. A = (A - B + mod[t]) % mod[t];
  34. A = A * base[t] % mod[t];
  35. A = (A + s[i][j + x - 1]) % mod[t];
  36. sum[t][i][j] = A;
  37. }
  38. }
  39. for(int j = 0; j < m; j ++) {
  40. long long C = 0;
  41. for(int i = 0; i < x; i ++) {
  42. C = C * b[t][x] % mod[t];
  43. C = (C + sum[t][i][j]) % mod[t];
  44. }
  45. h[t][0][j] = C;
  46. }
  47. for(int i = 1; i + x - 1 < n; i ++) {
  48. for(int j = 0; j + x - 1 < m; j ++) {
  49. long long A = h[t][i - 1][j];
  50. long long B = sum[t][i - 1][j] * b[t][x * (x - 1)] % mod[t];
  51. A = (A - B + mod[t]) % mod[t];
  52. A = A * b[t][x] % mod[t];
  53. A = (A + sum[t][i + x - 1][j]) % mod[t];
  54. h[t][i][j] = A;
  55. }
  56. }
  57. }
  58.  
  59. int sz = 0;
  60. for(int i = 0; i + x - 1 < n; i ++) {
  61. for(int j = 0; j + x - 1 < m; j ++) {
  62. pi[sz].first = h[0][i][j];
  63. pi[sz].second = h[1][i][j];
  64. sz ++;
  65. }
  66. }
  67. sort(pi, pi + sz);
  68. for(int i = 1; i < sz; i ++) {
  69. if(pi[i] == pi[i - 1]) return 1;
  70. }
  71.  
  72. return 0;
  73. }
  74.  
  75. int main() {
  76. init();
  77. b[0][0] = 1LL;
  78. b[1][0] = 1LL;
  79. for(int i = 1; i <= 250000; i ++) {
  80. b[0][i] = b[0][i - 1] * base[0] % mod[0];
  81. b[1][i] = b[1][i - 1] * base[1] % mod[1];
  82. }
  83. scanf("%d%d", &n, &m);
  84. for(int i = 0; i < n; i ++) {
  85. scanf("%s", s[i]);
  86. }
  87. int L = 1, R = min(n, m), ans = 0;
  88. while(L <= R) {
  89. int mid = (L + R) / 2;
  90. if(check(mid)) L = mid + 1, ans = mid;
  91. else R = mid - 1;
  92. }
  93. printf("%d\n", ans);
  94. return 0;
  95. }
  96.  
  97. /*
  98.  
  99. 5 10
  100. ljkfghdfas
  101. isdfjksiye
  102. pgljkijlgp
  103. eyisdafdsi
  104. lnpglkfkjl
  105.  
  106. */

牛客练习赛1 A - 矩阵的更多相关文章

  1. 【并查集缩点+tarjan无向图求桥】Where are you @牛客练习赛32 D

    目录 [并查集缩点+tarjan无向图求桥]Where are you @牛客练习赛32 D PROBLEM SOLUTION CODE [并查集缩点+tarjan无向图求桥]Where are yo ...

  2. 牛客练习赛31 B 赞迪卡之声妮莎与奥札奇 逻辑,博弈 B

    牛客练习赛31 B 赞迪卡之声妮莎与奥札奇 https://ac.nowcoder.com/acm/contest/218/B 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 2621 ...

  3. 牛客练习赛31 D 神器大师泰兹瑞与威穆 STL,模拟 A

    牛客练习赛31 D 神器大师泰兹瑞与威穆 https://ac.nowcoder.com/acm/contest/218/D 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 26214 ...

  4. 最小生成树--牛客练习赛43-C

    牛客练习赛43-C 链接: https://ac.nowcoder.com/acm/contest/548/C 来源:牛客网 题目描述 ​ 立华奏是一个刚刚开始学习 OI 的萌新. 最近,实力强大的 ...

  5. 牛客练习赛28-B(线段树,区间更新)

    牛客练习赛28 - B 传送门 题目 qn姐姐最好了~ ​ qn姐姐给你了一个长度为n的序列还有m次操作让你玩, ​ 1 l r 询问区间[l,r]内的元素和 ​ 2 l r 询问区间[l,r]内的 ...

  6. 牛客练习赛26:D-xor序列(线性基)

    链接:牛客练习赛26:D-xor序列(线性基) 题意:小a有n个数,他提出了一个很有意思的问题:他想知道对于任意的x, y,能否将x与这n个数中的任意多个数异或任意多次后变为y 题解:线性基 #inc ...

  7. [堆+贪心]牛客练习赛40-B

    传送门:牛客练习赛40 题面: 小A手头有 n 份任务,他可以以任意顺序完成这些任务,只有完成当前的任务后,他才能做下一个任务 第 i 个任务需要花费  x_i 的时间,同时完成第 i 个任务的时间不 ...

  8. 牛客练习赛 29 E 位运算?位运算!(线段树)

    题目链接  牛客练习赛29E 对$20$位分别建立线段树.首先$1$和$2$可以合起来搞(左移右移其实是等效的) 用个lazy标记下.转移的时候加个中间变量. $3$和$4$其实就是区间$01$覆盖操 ...

  9. 牛客练习赛22C Bitset

    牛客练习赛22C 一共有 n个数,第 i 个数是 xi  xi 可以取 [li , ri] 中任意的一个值. 设 ,求 S 种类数. 感觉二进制真是一个神奇的东西. #include <iost ...

随机推荐

  1. Java入门系列(五)JVM内存模型

    概述 根据<Java 虚拟机规范>中的说法,Java 虚拟机的内存结构可以分为公有和私有两部分. 公有指的是所有线程都共享的部分,指的是 Java 堆.方法区.常量池. 私有指的是每个线程 ...

  2. Java后台获取前端utf-8格式&nbsp;空格,使用trim()消除不了的解决办法

    byte bytes[] = {(byte) 0xC2,(byte) 0xA0}; String UTFSpace = new String(bytes,"utf-8"); htm ...

  3. 免費域名申請.me .im .in .co .la .do .ms .kz .tk .ru .mu .pn .tt

    免費申請域名 .la .la 域名 – 原先是ICANN分配給老撾的國家頂級域名,不過後來被同時作為了美國洛杉矶市的域名後綴. 免費申請地址: http://www.idv.la http://www ...

  4. Go net/http获取body中json格式数据

    Go net/http获取body中json格式数据 package main import ( "encoding/json" "fmt" "io/ ...

  5. UNIX环境高级编程 第8章 进程控制

    本章是UNIX系统中进程控制原语,包括进程创建.执行新程序.进程终止,另外还会对进程的属性加以说明,包括进程ID.实际/有效用户ID. 进程标识 每个进程某一时刻在系统中都是独一无二的,它们之间是用一 ...

  6. 【HASPDOG】卸载

    rpm -qa | grep aksusdb rpm -e aksusdb... rm -rf /var/hasplm

  7. mysql优化【转】

    最近听讲了博森瑞老师的mysql优化公开课,这个是我整理的笔记. 现在说一下mysql的内存和I/O方面的两个特点. 一. mysql内存特点: 1.  也有全局内存和每个session的内存(每个s ...

  8. SQL 根据关联表更新主表中字段数据

    今天遇到一个客户的数据更新问题,两个相关联的表,一个主表用于保存单据主要信息,一个副表用于保存单据的明细信息:现在要把主表的其中一个字段的数据更新到副表的一个字段中保存.精通的SQL语法的,当然是很简 ...

  9. 2018 ICPC 徐州网络赛

    2018 ICPC 徐州网络赛 A. Hard to prepare 题目描述:\(n\)个数围成一个环,每个数是\(0\)~\(2^k-1\),相邻两个数的同或值不为零,问方案数. solution ...

  10. 使用postman做接口测试(三)

    三,接口用例的设计 个人感觉用例的设计才是重要的哈,网上查了一些资料总结了一下 1.业务流程测试 通过性验证: 1, 按照接口文档上的参数,正常传参,是否可以返回正确的结果 2, 是否满足前提条件,比 ...