KMP求最小覆盖子矩阵 - poj2185

POJ2185_Milking Grid_KMP_二维最小覆盖子矩阵 【不能用最小公倍数或最大值覆盖子矩阵的宽和高!!】 昨天看了很久这个题,去POJ 的论坛上,看到几个分析说网上大多数的AC代码都是错的,只是POJ上的数据过于弱就过了,比如行方向上最小覆盖的列数(宽度)只要用到最小公倍数的就都是错的,希望大家做此题的时候注意一下,下面题解的时候会解释为什么是错的 题意: 给一个二维的字符串矩阵他的一个最小子矩阵 阅读详情

Milking Grid


题意:在字符矩阵中找出一个最小子矩阵,使其多次复制所得的矩阵包含原矩阵。

数据范围:1 <= R <= 10,000, 1 <= C <= 75

思路1:
先用KMP的next函数求出每行的最小循环子串的长度L,那么L,2L,3L,...都可以作为该行的循环子串。
此外,还可以存在像AAAABAAA的情况。
设m为mL<=col的最大值,那么由于列最多75,直接通过暴力比较,判断1...mL+1~col是否可以作为循环子串。
至于如何获取所求最小矩阵的宽度,这里采用http://poj.org/showmessage?message_id=153316的方法,
用一个数组统计长度出现的次数,最后从小到大遍历一遍,若出现次数为row的长度,即为我们所求的宽度。
至于高度的话,用KMP的next,每次比较整行,即可求得最小矩阵的高度。

#include <iostream>
#include <stdio.h>
#include <string.h>
#include <algorithm>

using namespace std;
const int maxr=10002;
const int maxc=80;
char grid[maxr][maxc]; //大矩阵
int row,col;//行和列
int rnext[maxr][maxc]; //rnext[i]:对应第i行字符串的next函数
int cnext[maxr]; //求纵向的next,每次比较的是整行
int rlen[maxr]; //rlen[i]:第i行字符串的最小循环子串的长度
int cnt[maxc];//cnt[i]:统计各宽度
poj 2185 : Milking Grid (KMP) 题意:给你一个字符矩阵出它的最小覆盖子矩阵,即使得这个子矩阵无限复制扩张之后的矩阵,能包含原来的矩阵。 即二维的最小覆盖子串。一看这题,容易想出一种很直观的做法:出每一行的最小重复串长度,取所有行的最小重复串长度的lcm为宽;对列也同样操作出高。这种想法虽然很直观,但是否正确呢?事实上,这种算法并不是正确的。如下面的这个反例: 2 8 ABCDEFAB AAAABAAA 对 阅读详情

相关推荐

奶牛矩阵 kmp最小循环节

题目链接 https://www.acwing.com/problem/content/description/161/ POJ - 2185 题目 每天早上,农夫约翰的奶牛们被挤奶的时候,都会站成一个R行C列的方阵。 现在在每个奶牛的身上标注表示其品种的大写字母,则所有奶牛共同构成了一个R行C列的字符矩阵。 现在给定由所有奶牛构成的矩阵它的最小覆盖子矩阵的面积是多少。 如果一...

lt的博客 630

最小矩阵宽度】

(Java&JS&Python&C&C++),实现:尺取法

CSDN 5554

最小矩阵宽度(滑动窗口算法-Java&Python&C++&JS实现)

使用滑动窗口的方法,维护一个窗口,在窗口中包含数组中所有的数字。现在要在这个矩阵中找一个宽度最小子矩阵,要子矩阵包含数组中所有的整数。输出包含一个整数,表示满足要子矩阵最小宽度,若找不到,输出-1.下一行包含K个整数,表示所需包含的数组,K个整数可能存在重复数字。矩阵第0、3列包含了1、2、3,矩阵第3、4列包含了1、2、3。给定一个矩阵,包含N*M个整数,和一个包含K个整数的数组。遍历矩阵,记录数组中每个数字在矩阵中出现的列索引。矩阵第1、2、3、4、5列包含了1、1、4。

一键难忘的博客 5486

POJ 2185 Milking Grid

http://poj.org/problem?id=2185 题意:给你一个字符矩阵出它的最小覆盖子矩阵,即使得这个子矩阵无限复制扩张之后的矩阵,能包含原来的矩阵。 即二维的最小覆盖子串。 思路:KMP很好的一道题。首先易证:最小覆盖子矩阵一定靠左上角。那么,我们考虑出每一行的最小重复串长度,所有行的最小重复串的长度的lcm就是最小重复子矩阵的宽。然后我们对列也做相同的操作

Chris_Home 758

华为机考真题 -- 最小矩阵宽度

给定一个矩阵,包含 N * M 个整数和一个包含 K 个整数的数组。现在要在这个矩阵中找一个宽度最小子矩阵,要子矩阵包含数组中所有的整数。说明:矩阵第0列和第3列包含了1,2,3,居住第3行和第4行包含了1,2,3,所以输出是2。下一行包含 K 个整数,表示所需包含的数组,K 个整数可能存在重复数字;输出包含一个整数,表示满足要子矩阵最小宽度,若找不到,输出-1。说明:矩阵第1,2,3,4,5列包含了1,1,4,说以输出是5。第一行输入两个正整数 N,M,表示矩阵大小;所有输入数据小于1000。

qq_25360769的博客 749

机试题——最小矩阵宽度

给定一个矩阵,包含 N * M 个整数,和一个包含 K 个整数的数组。现在要在这个矩阵中找一个宽度最小子矩阵,要子矩阵包含数组中所有的整数。

一枚菜鸡 1041

POJ 2185 Milking Grid (KMP最小覆盖子矩阵,好题)

题意:给出一个矩阵最小覆盖矩阵,大矩阵可由这个小矩阵拼成。(就如同拼磁砖,允许最后有残缺) 正确解法的参考链接:http://poj.org/showmessage?message_id=153316http://blog.sina.com.cn/s/blog_69c3f0410100tyjl.html 在discuss里还看到有人说可以这么简化:横向最小长度时每次比较整列...

weixin_30678821的博客 169

POJ2185 最小覆盖矩阵 (二维KMP

这题挺有意思的,主要把KMP理解透彻了,其实二维的可以看成一维的,原来是由单个字符组成字符串,现在就是由字符串组成字符串数组,在此基础上,其他操作和思想都是一样的,横向一遍next数组,那么最小的可覆盖的子串长度为:len-next[len],同理再一遍纵向的,相乘即可。#include<iostream> #include<stdio.h> #include<string.h> using

qq_33688997的博客 891

poj(2185) Milking Grid (很好的kmp题目)

http://poj.org/problem?id=2185 题意:给你一个字符矩阵出它的最小覆盖子矩阵,即使得这个子矩阵无限复制扩张之后的矩阵,能包含原来的矩阵。即二维的最小覆盖子串。 思路:KMP很好的一道题。首先易证:最小覆盖子矩阵一定靠左上角。那么,我们考虑出每一行的最小重复串长度,所有行的最小重复串的长度的lcm就是最小重复子矩阵的宽。然后我们对列也做相同的...

107

poj2185(二维最小覆盖子串问题-KMP

题意:给出一个二维的字符矩阵,问最小的可覆盖子矩阵大小。 解法:如果是一维的话,在KMP算法的Next数组中,len-Next[len]是一维的覆盖子串,如果len-Next[len]能整除len,则可恰好覆盖(即长度为len-Next[len]的前缀)。            在二维的情况,每行每列一个最小公倍数就可以了,并且公倍数不能大于本身总长度。 代码:/*****

xiefubao的专栏 1235

poj2185 Milking Grid(KMP

题意:给你一个n*m字符矩阵,然后让你找一个子矩阵,这个字符矩阵可以由这个子矩阵(若干个)覆盖(可以重叠)。然后输出这个子矩阵最小面积。 思路:一开始没想到怎么用KMP,看到别人的博客恍然大悟,相当于把多维矩阵映射成一个字符串处理。 矩阵的面积 = 长 * 宽。 找长度最小的长,把每一列看做一个字符。进行KMP匹配即可。 l = m - Next[m] 找长度最小的宽 ,把每行看做一个...

一身清贫怎敢入繁华 430

POJ 2185 Milking Grid(最小覆盖子矩阵面积KMP)

Milking Grid Time Limit: 3000MS   Memory Limit: 65536K Total Submissions: 4901   Accepted: 2043 Description Every morning when they are milked, the Farmer John's cows for

布生气 1518

[POJ2185]Milking Grid(KMP最小覆盖问题)

传送门 题意: 一个字符串矩阵最小覆盖矩阵。覆盖矩阵是指,字符串矩阵子矩阵通过复制平移的方式可以形成一个新的大矩阵使得原字符串矩阵成为他的子矩阵。如:    ABABA    CDCDC 他的最小覆盖矩阵为    AB    CD 因为将上面的矩阵复制平移后可以得到这样一个矩阵    ABABAB    CDCDCD 则原矩阵是这个新矩阵子矩阵。...

私は Mocha!! 565

KMPPOJ 2185 Milking Grid -- Next函数的应用

题目链接:http://poj.org/problem?id=2185 题目大意:一个二维的字符串矩阵最小覆盖子矩阵,即这个最小覆盖子矩阵在二维空间上不断翻倍后能覆盖原始矩阵。 题目分析:next函数的应用。需要枚举每一行每一列的字符串所对应的的 nxt[] 值,然后通过分析计算出最小的宽和最小的高。 具体分析 参考链接:https://blog.csdn.net/u01368653...

weixin_30421525的博客 109

POJ 2185 Milking Grid (KMP) (好题)

题意:给你一个字符矩阵出它的最小覆盖子矩阵,即使得这个子矩阵无限复制扩张之后的矩阵,能包含原来的矩阵。 即二维的最小覆盖子串。 和HDOJ1358 Period 一样,对于(1....x)串x-next[x]就是它自身的最小覆盖串,所以可以把每行的所有覆盖出来,找到他们的最小值, 即是最小覆盖子矩阵的宽,一些博客把每行的所有最小覆盖的公倍数了出来,这样的确可以覆盖整个矩阵但不是最小

kalilili的专栏 1034

POJ2185 Milking Grid 最小覆盖子矩阵(二维KMP

题目大意:有一个R×C规模的字符矩阵最小子矩阵,使该矩阵可以由子矩阵平移得到,输出子矩阵的大小。 分析:很明显,符合条件的子矩阵(设该矩阵的规模为w×h)需要同时满足: (1)该子矩阵的h行可以看成h个字符串,原矩阵中任一行字符串都可以由这h个字符串中的一个平铺形成; (2)该子矩阵的w列也可以看成w个字符串,原矩阵中任一列字符串也都可以由这w个字符串中的一个平铺而成;

AC_Gibson的专栏 1107

poj 2185

题意:给你一个字符矩阵出它的最小覆盖子矩阵,即使得这个子矩阵无限复制扩张之后的矩阵,能包含原来的矩阵。 即二维的最小覆盖子串。 思路:KMP很好的一道题。首先易证:最小覆盖子矩阵一定靠左上角。那么,我们考虑出每一行的最小重复串长度,所有行的最小重复串的长度的lcm就是最小重复子矩阵的宽。然后我们对列也做相同的操作。于是我们就可以最小重复子矩阵的大小了。(这里要注意一点:当所得...

一颗平常心 115
上一篇: 关于人工智能的一些想法
下一篇: Hahs+LCP(最长公共前缀) - UvaL 4513
Exchan
博客等级 码龄10年 11粉丝 71原创
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值