POJ:2185-Milking Grid(KMP找矩阵循环节)
Milking Grid
Time Limit: 3000MS
Memory Limit: 65536K
Description
Every morning when they are milked, the Farmer John’s cows form a rectangular grid that is R (1 <= R <= 10,000) rows by C (1 <= C <= 75) columns. As we all know, Farmer John is quite the expert on cow behavior, and is currently writing a book about feeding behavior in cows. He notices that if each cow is labeled with an uppercase letter indicating its breed, the two-dimensional pattern formed by his cows during milking sometimes seems to be made from smaller repeating rectangular patterns.
Help FJ find the rectangular unit of smallest area that can be repetitively tiled to make up the entire milking grid. Note that the dimensions of the small rectangular unit do not necessarily need to divide evenly the dimensions of the entire milking grid, as indicated in the sample input below.
Input
Line 1: Two space-separated integers: R and C
Lines 2..R+1: The grid that the cows form, with an uppercase letter denoting each cow’s breed. Each of the R input lines has C characters with no space or other intervening character.
OutputLine 1: The area of the smallest unit from which the grid is formed
Sample Input
2 5
ABABA
ABABA
Sample Output
2
Hint
The entire milking grid can be constructed from repetitions of the pattern ‘AB’.
解题心得:
- 题意就是给你一个字符矩阵,叫你找出这个字符矩阵的循环节(子矩阵)的大小,给你的字符矩阵可能只是给你一部分。
- 刚开始在看到这个题的时候瞬间想到了每一行用KMP找循环节,然后求最小公倍数,然后WA,闷了好久才反应过来为啥只在行里面找,每一列也需要用KMP找寻环节得到列的最小公倍数,然后行列的最小公倍数乘起来才是最小循环矩阵的面积啊。但是要注意如果行或者列的最小公倍数比给出的n,m更大的时候要选择n,m,就是以自身为一个循环节
- 注意行列的大小,开数组的时候不要开反了,RE到怀疑人生。
#include<stdio.h>
#include<math.h>
#include<cstring>
#include<algorithm>
#include<iostream>
using namespace std;
typedef long long ll;
const int maxn_length = 1e4+100;
const int maxn_wide = 100;
char maps[maxn_length][maxn_wide];
ll n,m,next[maxn_length];
ll __gcd(ll a,ll b)
{
if(b == 0)
return a;
return __gcd(b,a%b);
}
ll kmp_len(ll pos)//每一行看毛片
{
ll k = -1;
memset(next,-1,sizeof(next));
for(int i=1;i<m;i++)
{
while(k > -1 && maps[pos][i] != maps[pos][k+1])
k = next[k];
if(maps[pos][i] == maps[pos][k+1])
k++;
next[i] = k;
}
return m-1-next[m-1];
}
ll get_lcm_length()//得到每一行的最小公倍数
{
ll ans = 1,cnt;
for(int i=0;i<n;i++)
{
ll len = kmp_len(i);
cnt = ans/__gcd(len,ans)*len;
ans = cnt;
if(ans > m)
return m;
}
return ans;
}
ll kmp_wide(ll pos)//每一列看毛片
{
ll k = -1;
memset(next,-1,sizeof(next));
for(int i=1;i<n;i++)
{
while(k > -1 && maps[i][pos] != maps[k+1][pos])
k = next[k];
if(maps[i][pos] == maps[k+1][pos])
k++;
next[i] = k;
}
return n-1-next[n-1];
}
ll get_lcm_wide()//得到每一列的最小公倍数
{
ll ans = 1,cnt;
for(int i=0;i<m;i++)
{
ll wide = kmp_wide(i);
cnt = ans/__gcd(ans,wide)*wide;
ans = cnt;
if(ans > n)
return n;
}
return ans;
}
int main()
{
while(cin>>n>>m)
{
for(int i=0;i<n;i++)
scanf("%s",maps[i]);
ll lcm_len = get_lcm_length();
ll lcm_wide = get_lcm_wide();
lcm_len = min(lcm_len,(ll)m);
lcm_wide = min(lcm_wide,(ll)n);
ll ans = lcm_len * lcm_wide;
printf("%lld\n",ans);
}
return 0;
}
POJ:2185-Milking Grid(KMP找矩阵循环节)的更多相关文章
- POJ 2185 Milking Grid KMP(矩阵循环节)
Milking Grid Time Limit: 3000MS Memory Lim ...
- POJ 2185 Milking Grid KMP循环节周期
题目来源:id=2185" target="_blank">POJ 2185 Milking Grid 题意:至少要多少大的子矩阵 能够覆盖全图 比如例子 能够用一 ...
- POJ 2185 Milking Grid [KMP]
Milking Grid Time Limit: 3000MS Memory Limit: 65536K Total Submissions: 8226 Accepted: 3549 Desc ...
- [poj 2185] Milking Grid 解题报告(KMP+最小循环节)
题目链接:http://poj.org/problem?id=2185 题目: Description Every morning when they are milked, the Farmer J ...
- POJ 2185 Milking Grid [二维KMP next数组]
传送门 直接转田神的了: Milking Grid Time Limit: 3000MS Memory Limit: 65536K Total Submissions: 6665 Accept ...
- POJ 2185 Milking Grid(KMP)
Milking Grid Time Limit: 3000MS Memory Limit: 65536K Total Submissions: 4738 Accepted: 1978 Desc ...
- POJ 2185 Milking Grid(KMP最小循环节)
http://poj.org/problem?id=2185 题意: 给出一个r行c列的字符矩阵,求最小的覆盖矩阵可以将原矩阵覆盖,覆盖矩阵不必全用完. 思路: 我对于字符串的最小循环节是这么理解的: ...
- 题解报告:poj 2185 Milking Grid(二维kmp)
Description Every morning when they are milked, the Farmer John's cows form a rectangular grid that ...
- poj 2185 Milking Grid
Milking Grid http://poj.org/problem?id=2185 Time Limit: 3000MS Memory Limit: 65536K Descript ...
- Poj 2165 Milking Grid(kmp)
Milking Grid Time Limit: 3000MS Memory Limit: 65536K Description Every morning when they are milked, ...
随机推荐
- Unity3d开发的第一个实例
1.untiy3d开发环境配置好以后,开始我的第一个开发实例 2.在Hirearch---create---3DObject---Cube,在场景中创建一个正方体 3.project---create ...
- 两道sql面试题
两道sql面试题: 1. 数据库表A的数据如下: year quarter 2001 1 2001 ...
- 寻找jar包的方法
在项目开发中经常会遇到资源jar查找难的问题,一种使用maven ,另一种方法是: (1).使用下载地址:https://oss.sonatype.org/content/repositories/r ...
- aspx有"记住我"的登录
客户端 <form id="form1" runat="server"> <div> 用户名:<input type=" ...
- Java并发(六):并发策略
通过多次优化实例来了解选择并发策略的正确姿势 通过模拟浏览器程序的渲染页面(Page-Rendering)功能,为了方便,假设HTML页面只会包含标签文本和图片以及URL; 第一个版本:串行加载页面元 ...
- linux 下源码编译环境配置
yum install -y apr* autoconf automake bison bzip2 bzip2* compat* cpp curl curl-devel \ fontconfig fo ...
- HDU 3697 Selecting courses 选课(贪心)
题意: 一个学生要选课,给出一系列课程的可选时间(按分钟计),在同一时刻只能选一门课程(精确的),每隔5分钟才能选一次课,也就是说,从你第一次开始选课起,每过5分钟,要么选课,要么不选,不能隔6分钟再 ...
- java Vamei快速教程09 类数据和类方法
作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明.谢谢! 我们一直是为了产生对象而定义类(class)的.对象是具有功能的实体,而类是对象的 ...
- 免费的freedns实现动态域名和url转发
路由器的固件是dd-wrt 到freedns.afraid.org上注册一个动态域名,如果默认的端口无法使用80,需要配置二级域名的url转发功能. 实测2个月很稳定. 另外为了防止主机ip地址更新频 ...
- eclipse Indigo搭建SSH框架详解
SSH框架是最常用的框架之一,在搭建SSH框架的时候总有人遇到这样,那样的问题.下面我介绍一下SSH框架搭建的全过程. 第一步:准备工作. 下载好eclipse,Struts2,Spring,Hi ...