POJ2185Milking Grid(最小覆盖子串 + 二维KMP)
题意: 一个r*c的矩形,求一个子矩形通过平移复制能覆盖整个矩形
关于一个字符串的最小覆盖子串可以看这里http://blog.csdn.net/fjsd155/article/details/6866991
把他分成对行和对列,对行覆盖最小就是n - next[n] ,然后求最小公倍数
对列的也是n - next[n], 然后求最小公倍数
- #include <iostream>
- #include <cstdio>
- #include <algorithm>
- #include <cstring>
- using namespace std;
- const int Max = 100000 + 10;
- char str[Max][100];
- int Next[Max];
- int r, c;
- int getNextc(int n)
- {
- int k = -1;
- Next[0] = -1;
- int i = 0;
- while (i < c)
- {
- while (k != -1 && str[n][i] != str[n][k])
- k = Next[k];
- Next[++i] = ++k;
- }
- return c - Next[c]; // 是 c - Next[c],next[c]才是整个串 最长(前缀 == 后缀)
- }
- int getNextr(int n)
- {
- int k = -1;
- Next[0] = -1;
- int i = 0;
- while (i < r)
- {
- while (k != -1 && str[i][n] != str[k][n])
- k = Next[k];
- Next[++i] = ++k;
- }
- return r - Next[r];
- }
- int gcd(int a, int b)
- {
- if (a == 0)
- return b;
- return gcd(a % b, a);
- }
- int getNum(int a, int b)
- {
- if (a > b)
- swap(a, b);
- int d = gcd(a, b);
- return a / d * b;
- }
- int main()
- {
- while (scanf("%d%d", &r, &c) != EOF)
- {
- getchar();
- for (int i = 0; i < r; i++)
- scanf("%s", str[i]);
- int ans1 = 1, ans2 = 1;
- for (int i = 0; i < r; i++) // 按行处理
- {
- memset(Next, 0, sizeof(Next));
- ans1 = getNum(ans1, getNextc(i));
- if (ans1 >= c)
- {
- ans1 = c;
- break;
- }
- }
- for (int i = 0; i < c; i++)
- {
- memset(Next, 0, sizeof(Next));
- ans2 = getNum(ans2, getNextr(i));
- if (ans2 >= r)
- {
- ans2 = r;
- break;
- }
- }
- printf("%d\n", ans1 * ans2);
- }
- return 0;
- }
POJ2185Milking Grid(最小覆盖子串 + 二维KMP)的更多相关文章
- 二维KMP - 求字符矩阵的最小覆盖矩阵 - poj 2185
Milking Grid Problem's Link:http://poj.org/problem?id=2185 Mean: 给你一个n*m的字符矩阵,让你求这个字符矩阵的最小覆盖矩阵,输出这个最 ...
- 题解报告:poj 2185 Milking Grid(二维kmp)
Description Every morning when they are milked, the Farmer John's cows form a rectangular grid that ...
- Match:Milking Grid(二维KMP算法)(POJ 2185)
奶牛矩阵 题目大意:给定一个矩阵,要你找到一个最小的矩阵,这个矩阵的无限扩充的矩阵包含着原来的矩阵 思路:乍一看这一题确实很那做,因为我们不知道最小矩阵的位置,但是仔细一想,如果我们能把矩阵都放在左上 ...
- POJ 2185 - Milking Grid (二维KMP)
题意:给出一个字符矩形,问找到一个最小的字符矩形,令它无限复制之后包含原来的矩形. 此题用KMP+枚举来做. 一维的字符串匹配问题可以用KMP来解决.但是二维的就很难下手.我们可以将二维问题转化为一维 ...
- POJ_2185_二维KMP
http://poj.org/problem?id=2185 求最小覆盖矩阵,把KMP扩展到二维,行一次,列一次,取最小覆盖线段相乘即可. #include<iostream> #incl ...
- POJ--2158--------------Milking Grid(最小覆盖字符矩阵)---(开二维kmp)
Milking Grid Time Limit: 3000MS Memory Limit: 65536K Total Submissions: 6169 Accepted: 2573 Desc ...
- POJ 2185 Milking Grid [二维KMP next数组]
传送门 直接转田神的了: Milking Grid Time Limit: 3000MS Memory Limit: 65536K Total Submissions: 6665 Accept ...
- POJ2185 Milking Grid KMP两次(二维KMP)较难
http://poj.org/problem?id=2185 大概算是我学KMP简单题以来最废脑子的KMP题目了 , 当然细节并不是那么多 , 还是码起来很舒服的 , 题目中描写的平铺是那种瓷砖一 ...
- poj 2185(二维kmp)
题意:让你求一个最小的覆盖子矩阵. 分析:首先第一点是确定的:那就是这个子矩阵肯定位于左上角,然后按行考虑,求出每一行可能的重复子串的长度,然后取所有行都存在并且长度最短的长度最为最小子矩阵的宽, 最 ...
随机推荐
- Overlay network 覆盖网络
From Wikipedia, the free encyclopedia An overlay network is a computer network that is built on top ...
- Hibernate之Annotation(注解的方式,非映射)
在hibernate 3.0之后,可以建立一个符合JPA标准的Annotation,以hibernate3.3.2GA为例 Annotation 以 hibernate Annotation 3.3. ...
- python学习笔记整理——集合 set
python学习整理笔记--集合 set 集合的用途:成员测试和消除重复的条目,进行集合运算 注意:花括号或set()函数可以用于创建集合. 注意:若要创建一个空的集合你必须使用set(),不能用{} ...
- 常用数据库高可用和分区解决方案(2) — MongoDB篇
MongoDB是当前比较流行的文档型数据库,其拥有易使用.易扩展.功能丰富.性能卓越等特性.MongoDB本身就拥有高可用及分区的解决方案,分别为副本集(Replica Set)和分片(shardin ...
- 1025关于explain的补充1
https://segmentfault.com/q/1010000004195469 我的困惑 http://www.cnblogs.com/BeginMan/p/3754322.html 可以指定 ...
- Java反射机制学习与研究
Java反射机制:可以获取正在运行时的Java对象. 1.判断运行时对象对象所属的类. 2.判断运行时对象所具有的成员变量和方法. 3.还可以调用到private方法,改变private变量的值. S ...
- 利用反射,泛型,静态方法快速获取表单值到Model
在项目中经常需要处理表单,给model赋值,很烦人的一些重复代码.如下边的代码: News news = new News(); news.Id = int.Parse(Request.Form[&q ...
- leetcode(一)Word Pattern
题目描述: Given a pattern and a string str, find if str follows the same pattern. Here follow means a fu ...
- ES6新特性:let和const的使用
(声明, 本文的所有代码均在node的最新稳定版本v4.4.3中执行的, 如果在浏览器中执行请把JS的运行环境提升为ES6) 以前一直用var定义变量, 现在有了两种新的定义变量的方式, 1: let ...
- awk打印出当前行的上一行
#awk '/B/{print a;}{a=$0}' a.txt A # cat a.txt A BCDE