题意: 一个r*c的矩形,求一个子矩形通过平移复制能覆盖整个矩形

关于一个字符串的最小覆盖子串可以看这里http://blog.csdn.net/fjsd155/article/details/6866991

把他分成对行和对列,对行覆盖最小就是n - next[n] ,然后求最小公倍数

对列的也是n - next[n], 然后求最小公倍数

  1. #include <iostream>
  2. #include <cstdio>
  3. #include <algorithm>
  4. #include <cstring>
  5. using namespace std;
  6. const int Max = 100000 + 10;
  7. char str[Max][100];
  8. int Next[Max];
  9. int r, c;
  10. int getNextc(int n)
  11. {
  12. int k = -1;
  13. Next[0] = -1;
  14. int i = 0;
  15. while (i < c)
  16. {
  17. while (k != -1 && str[n][i] != str[n][k])
  18. k = Next[k];
  19. Next[++i] = ++k;
  20. }
  21. return c - Next[c]; // 是 c - Next[c],next[c]才是整个串 最长(前缀 == 后缀)
  22. }
  23. int getNextr(int n)
  24. {
  25. int k = -1;
  26. Next[0] = -1;
  27. int i = 0;
  28. while (i < r)
  29. {
  30. while (k != -1 && str[i][n] != str[k][n])
  31. k = Next[k];
  32. Next[++i] = ++k;
  33. }
  34. return r - Next[r];
  35. }
  36. int gcd(int a, int b)
  37. {
  38. if (a == 0)
  39. return b;
  40. return gcd(a % b, a);
  41. }
  42. int getNum(int a, int b)
  43. {
  44. if (a > b)
  45. swap(a, b);
  46. int d = gcd(a, b);
  47. return a / d * b;
  48. }
  49. int main()
  50. {
  51.  
  52. while (scanf("%d%d", &r, &c) != EOF)
  53. {
  54. getchar();
  55. for (int i = 0; i < r; i++)
  56. scanf("%s", str[i]);
  57. int ans1 = 1, ans2 = 1;
  58. for (int i = 0; i < r; i++) // 按行处理
  59. {
  60. memset(Next, 0, sizeof(Next));
  61. ans1 = getNum(ans1, getNextc(i));
  62. if (ans1 >= c)
  63. {
  64. ans1 = c;
  65. break;
  66. }
  67. }
  68. for (int i = 0; i < c; i++)
  69. {
  70. memset(Next, 0, sizeof(Next));
  71. ans2 = getNum(ans2, getNextr(i));
  72. if (ans2 >= r)
  73. {
  74. ans2 = r;
  75. break;
  76. }
  77. }
  78. printf("%d\n", ans1 * ans2);
  79. }
  80. return 0;
  81. }

  

POJ2185Milking Grid(最小覆盖子串 + 二维KMP)的更多相关文章

  1. 二维KMP - 求字符矩阵的最小覆盖矩阵 - poj 2185

    Milking Grid Problem's Link:http://poj.org/problem?id=2185 Mean: 给你一个n*m的字符矩阵,让你求这个字符矩阵的最小覆盖矩阵,输出这个最 ...

  2. 题解报告:poj 2185 Milking Grid(二维kmp)

    Description Every morning when they are milked, the Farmer John's cows form a rectangular grid that ...

  3. Match:Milking Grid(二维KMP算法)(POJ 2185)

    奶牛矩阵 题目大意:给定一个矩阵,要你找到一个最小的矩阵,这个矩阵的无限扩充的矩阵包含着原来的矩阵 思路:乍一看这一题确实很那做,因为我们不知道最小矩阵的位置,但是仔细一想,如果我们能把矩阵都放在左上 ...

  4. POJ 2185 - Milking Grid (二维KMP)

    题意:给出一个字符矩形,问找到一个最小的字符矩形,令它无限复制之后包含原来的矩形. 此题用KMP+枚举来做. 一维的字符串匹配问题可以用KMP来解决.但是二维的就很难下手.我们可以将二维问题转化为一维 ...

  5. POJ_2185_二维KMP

    http://poj.org/problem?id=2185 求最小覆盖矩阵,把KMP扩展到二维,行一次,列一次,取最小覆盖线段相乘即可. #include<iostream> #incl ...

  6. POJ--2158--------------Milking Grid(最小覆盖字符矩阵)---(开二维kmp)

    Milking Grid Time Limit: 3000MS   Memory Limit: 65536K Total Submissions: 6169   Accepted: 2573 Desc ...

  7. POJ 2185 Milking Grid [二维KMP next数组]

    传送门 直接转田神的了: Milking Grid Time Limit: 3000MS   Memory Limit: 65536K Total Submissions: 6665   Accept ...

  8. POJ2185 Milking Grid KMP两次(二维KMP)较难

    http://poj.org/problem?id=2185   大概算是我学KMP简单题以来最废脑子的KMP题目了 , 当然细节并不是那么多 , 还是码起来很舒服的 , 题目中描写的平铺是那种瓷砖一 ...

  9. poj 2185(二维kmp)

    题意:让你求一个最小的覆盖子矩阵. 分析:首先第一点是确定的:那就是这个子矩阵肯定位于左上角,然后按行考虑,求出每一行可能的重复子串的长度,然后取所有行都存在并且长度最短的长度最为最小子矩阵的宽, 最 ...

随机推荐

  1. Overlay network 覆盖网络

    From Wikipedia, the free encyclopedia An overlay network is a computer network that is built on top ...

  2. Hibernate之Annotation(注解的方式,非映射)

    在hibernate 3.0之后,可以建立一个符合JPA标准的Annotation,以hibernate3.3.2GA为例 Annotation 以 hibernate Annotation 3.3. ...

  3. python学习笔记整理——集合 set

    python学习整理笔记--集合 set 集合的用途:成员测试和消除重复的条目,进行集合运算 注意:花括号或set()函数可以用于创建集合. 注意:若要创建一个空的集合你必须使用set(),不能用{} ...

  4. 常用数据库高可用和分区解决方案(2) — MongoDB篇

    MongoDB是当前比较流行的文档型数据库,其拥有易使用.易扩展.功能丰富.性能卓越等特性.MongoDB本身就拥有高可用及分区的解决方案,分别为副本集(Replica Set)和分片(shardin ...

  5. 1025关于explain的补充1

    https://segmentfault.com/q/1010000004195469 我的困惑 http://www.cnblogs.com/BeginMan/p/3754322.html 可以指定 ...

  6. Java反射机制学习与研究

    Java反射机制:可以获取正在运行时的Java对象. 1.判断运行时对象对象所属的类. 2.判断运行时对象所具有的成员变量和方法. 3.还可以调用到private方法,改变private变量的值. S ...

  7. 利用反射,泛型,静态方法快速获取表单值到Model

    在项目中经常需要处理表单,给model赋值,很烦人的一些重复代码.如下边的代码: News news = new News(); news.Id = int.Parse(Request.Form[&q ...

  8. leetcode(一)Word Pattern

    题目描述: Given a pattern and a string str, find if str follows the same pattern. Here follow means a fu ...

  9. ES6新特性:let和const的使用

    (声明, 本文的所有代码均在node的最新稳定版本v4.4.3中执行的, 如果在浏览器中执行请把JS的运行环境提升为ES6) 以前一直用var定义变量, 现在有了两种新的定义变量的方式, 1: let ...

  10. awk打印出当前行的上一行

    #awk '/B/{print a;}{a=$0}' a.txt A # cat a.txt A BCDE