二维KMP - 求字符矩阵的最小覆盖矩阵 - poj 2185
Milking Grid
Problem's Link:http://poj.org/problem?id=2185
Mean:
给你一个n*m的字符矩阵,让你求这个字符矩阵的最小覆盖矩阵,输出这个最小覆盖矩阵的面积。
analyse:
做了上一篇博客的题目,就会求一个字符串的最小覆盖矩阵。同样的,现在求字符矩阵的最小覆盖矩阵,只是将一维推向了二维,我们在纸上画一下图,你会发现,其实二维的也是so easy!
我们将每一行的字符串的最小覆盖子串求出来,然后对这n个数求LCM,那么结果就是行覆盖的最小覆盖子串;同样的我们再对每一列求最小覆盖子串,然后对这m个数求LCM,那么结果就是列覆盖的最小覆盖子串。
最后的答案:area=两个数的乘积。
Time complexity:O(n*m)
Source code:
// Memory Time
// 1347K 0MS
// by : Snarl_jsb
// 2014-10-03-20.59
#include<algorithm>
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<iostream>
#include<vector>
#include<queue>
#include<stack>
#include<map>
#include<string>
#include<climits>
#include<cmath>
#define N 1000010
#define LL long long
using namespace std; char str[][],tmp[];
int row[],col[];
vector<int> next;
void GetNext(char str[])
{
// puts(str);
next.clear();
next.push_back();
int len=strlen(str);
int k=;
for(int i=;i<len;++i)
{
while(k!=&&str[i]!=str[k])
k=next[k-];
if(str[i]==str[k])
k++;
next.push_back(k);
}
// for(int i=0;i<len;++i)
// cout<<next[i]<<endl;
}
int gcd(int a,int b)
{
return b==?a:gcd(b,a%b);
}
int lcm(int a,int b)
{
return a*b/gcd(a,b);
} int main()
{
ios_base::sync_with_stdio(false);
cin.tie();
// freopen("C:\\Users\\ASUS\\Desktop\\cin.cpp","r",stdin);
// freopen("C:\\Users\\ASUS\\Desktop\\cout.cpp","w",stdout);
int r,c;
cin>>r>>c;
for(int i=;i<r;++i)
{
scanf("%s",str[i]);
}
int len;
len=c;
for(int i=;i<r;++i)
{
GetNext(str[i]);
row[i]=len-next[len-] ;
}
len=r;
for(int i=;i<c;++i)//列
{
for(int j=;j<r;++j)//行
{
tmp[j]=str[j][i];
}
GetNext(tmp);
col[i]=len-next[len-];
}
int r1=row[];
for(int i=;i<r;++i)
{
r1=lcm(r1,row[i]);
if(r1>c)
{
r1=c;
break;
}
}
int c1=col[];
for(int i=;i<c;++i)
{
c1=lcm(c1,col[i]);
if(c1>r)
{
c1=r;
break;
}
}
// cout<<r1<<endl;
// cout<<c1<<endl;
cout<<r1*c1<<endl;
return ;
}
二维KMP - 求字符矩阵的最小覆盖矩阵 - poj 2185的更多相关文章
- 【C语言】二维数组中的查找,杨氏矩阵
//二维数组中的查找,杨氏矩阵 //在一个二维数组中,每行都依照从左到右的递增的顺序排序.每列都依照从上到下递增的顺序排序. //请完毕一个函数.输入这种一个数组和一个数,推断数组中是否包括这个数. ...
- 【c语言】二维数组中的查找,杨氏矩阵在一个二维数组中,每行都依照从左到右的递增的顺序排序,输入这种一个数组和一个数,推断数组中是否包括这个数
// 二维数组中的查找,杨氏矩阵在一个二维数组中.每行都依照从左到右的递增的顺序排序. // 每列都依照从上到下递增的顺序排序.请完毕一个函数,输入这种一个数组和一个数.推断数组中是否包括这个数 #i ...
- 题解报告:poj 2185 Milking Grid(二维kmp)
Description Every morning when they are milked, the Farmer John's cows form a rectangular grid that ...
- POJ_2185_二维KMP
http://poj.org/problem?id=2185 求最小覆盖矩阵,把KMP扩展到二维,行一次,列一次,取最小覆盖线段相乘即可. #include<iostream> #incl ...
- Match:Milking Grid(二维KMP算法)(POJ 2185)
奶牛矩阵 题目大意:给定一个矩阵,要你找到一个最小的矩阵,这个矩阵的无限扩充的矩阵包含着原来的矩阵 思路:乍一看这一题确实很那做,因为我们不知道最小矩阵的位置,但是仔细一想,如果我们能把矩阵都放在左上 ...
- POJ 2185 - Milking Grid (二维KMP)
题意:给出一个字符矩形,问找到一个最小的字符矩形,令它无限复制之后包含原来的矩形. 此题用KMP+枚举来做. 一维的字符串匹配问题可以用KMP来解决.但是二维的就很难下手.我们可以将二维问题转化为一维 ...
- hdu 1081 To The Max(二维压缩的最大连续序列)(最大矩阵和)
Problem Description Given a two-dimensional array of positive and negative integers, a sub-rectangle ...
- Codeforces Round #524 (Div. 2)C 二维坐标系求俩矩形面积交
题:https://codeforces.com/contest/1080/problem/C 题意:给n*m的二维坐标系,每个位置(xi,yi)都表示一个方格,(1,1)的位置是白色,整个坐标系黑白 ...
- POJ 2185 Milking Grid [二维KMP next数组]
传送门 直接转田神的了: Milking Grid Time Limit: 3000MS Memory Limit: 65536K Total Submissions: 6665 Accept ...
随机推荐
- TaskHosting - 开发桌面工具原来还可以这么简单
由来 对于喜欢开发的我经常会写一些小工具,这些小工具多以功能为主,不要求漂亮.个性化的UI.但起码要保证使用方便,因此最基本的功能要有: GUI(图片用户界面) 程序配置的保存与读取(让用户在GUI上 ...
- console 让 js 调试更简单
浏览器的控制台(console)是最重要的面板,主要作用是显示网页加载过程中产生各类信息. 显示信息 console.log('hello world'); console.debug('debug' ...
- OpenCV 2.4.8组件结构全解析
转自: http://blog.csdn.net/huang9012/article/details/21811271 之前啃了不少OpenCV的官方文档,发现如果了解了一些OpenCV整体的模块架构 ...
- 【转载】怎样使用ZEMAX导出高质量的图像动画
Zemax 导出高质量图片与动画 (2013-08-13 11:01:51) http://blog.sina.com.cn/s/blog_628dd2bc0101dycu.html 转载▼ How ...
- Apache Internal Server Error
当使用 Apache 作为服务器,使用 cgi 程序接收来自 web 端的访问时,出现如下错误: Internal Server Error The server encountered an int ...
- Android表情功能
Android表情功能 标签(空格分隔): 未分类 转载自:android edittext插入表情(基于socket方式),并对文中不正确的内容进行整理和修正 [TOC] 涉及知识点: Androi ...
- cordova plugin数据传递概要
cordova plugin数据传递概要: 1.调用pluginManager向所有插件发送消息: PluginManager.postMessage(String id, Object data); ...
- 将数据库表导入到solr索引
将数据库表导入到solr索引 编辑solrcofnig.xml添加处理器 <requestHandler name="/dataimport" class="org ...
- 构建基于WinRT的WP8.1 App 03:Page控件
单页面模板 通常利用Visual Studio 2013创建的最简单的WP8.1应用是Blank App,它只包含一个不带任何UI的页面,并且没有任何状态管理的逻辑. 该不带任何UI的页面称为Blan ...
- 专访Linux嵌入式开发韦东山操作系统图书作者--转
CSDN学院讲师韦东山:悦己之作,方能悦人 发表于2015-04-28 08:09| 6669次阅读| 来源CSDN| 24 条评论| 作者夏梦竹 专访Linux嵌入式开发韦东山操作系统图书作者 摘要 ...