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, ...
随机推荐
- SpringBoot | 第十八章:web应用开发之WebJars使用
前言 前面一章节我们主要讲解了关于文件上传的两种方式.本章节继续web开发的相关知识点.通常对于web开发而言,像js.css.images等静态资源版本管理是比较混乱的,比如Jquery.Boots ...
- 《C#高效编程》读书笔记11-理解短小方法的优势
我们最好尽可能的编写最清晰的代码,将优化交给JIT编译器完成.一个常见的错误优化是,将大量逻辑放在一个函数中,以期减少额外的方法调用开销.这种将函数逻辑直接写在循环内部的常见优化做法却会降低.NET应 ...
- BZOJ3624: [Apio2008]免费道路(最小生成树)
题意 题目链接 Sol 首先答案一定是一棵树 这棵树上有一些0边是必须要选的,我们先把他们找出来,如果数量$\geqslant k$显然无解 再考虑继续往里面加0的边,判断能否加到k条即可 具体做法是 ...
- Retrofit 2.0 轻松实现多文件/图片上传/Json字符串/表单
如果嫌麻烦直接可以用我封装好的库:Novate: https://github.com/Tamicer/Novate 通过对Retrofit2.0的前两篇的基础入门和案例实践,掌握了怎么样使用Retr ...
- 通过 java的 esl 连接 freeswitch
一.目标修改event_socket配置,使之能够建立远端ESL链接. 二.步骤 1. vim ../autoload_configs/event_socket.conf.xml 2. 默认的监听地址 ...
- 爬虫系统Lucene分词
思路:查询数据库中信息,查询出id和name把那么进行分词存入文件 package com.open1111.index; import java.io.IOException;import java ...
- 梦织未来Windows驱动编程 第06课 驱动对磁盘文件的操作
代码部分: 实现一个文件C:\\text.txt,并读取写入内容到文件,然后将文件设置为只读,并隐藏文件.代码如下: //MyCreateFile.c //2016.07.22 #include &l ...
- 工作流性能优化(敢问activiti有扩展性?)(2)
2015/4/17 粗略看了activiti的sql的,在ativity engine包里边: 没什么头绪,先用excel记录数据量少的时候本机的性能情况: 不打印hibernate的sql:一刷 ...
- vue登录权限
登录:当用户填写完账号和密码后向服务端验证是否正确,验证通过之后,服务端会返回一个token,拿到token之后(我会将这个token存贮到cookie中,保证刷新页面后能记住用户登录状态),前端会根 ...
- ZOJ-1654 Place the Robots---二分图最小点覆盖+构图
题目链接: https://vjudge.net/problem/ZOJ-1654 题目大意: 有一个N*M(N,M<=50)的棋盘,棋盘的每一格是三种类型之一:空地.草地.墙.机器人只能放在空 ...