POJ--2158--------------Milking Grid(最小覆盖字符矩阵)---(开二维kmp)

Milking Grid

Time Limit: 3000MS   Memory Limit: 65536K
Total Submissions: 6169   Accepted: 2573

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.

Output

* Line 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‘.

Source

USACO 2003 Fall

这道题,题目不是很好懂,首先是

aabcdeaa

acbdeead

dakfdkkk      ---》求最小的子矩阵 其实很简单的呀,对一行求出最小的循环节点  对每一列求出最小的循环节点就行了max={max, RR-next[RR]}

dasdsdd         max1 ={max1,CC-next[CC]};  然后相乘得到了他的面积:   max1*max ==ans;

代码:

 1 #include<iostream>
 2 #include<cstring>
 3 #include<cstdlib>
 4 #include<cstdio>
 5 #include<algorithm>
 6 using namespace std;
 7 const int row =10050;
 8 const int cow =80;
 9 char str[row][cow];
10 int next[row][cow];
11 int RR,CC;
12 int main()
13 {
14   while(scanf("%d%d",&RR,&CC)!=EOF)
15   {
16       for(int i=0;i<RR;i++)
17           scanf("%s",str[i]);
18      int i,j,k;
19      //先求出每一行的next
20      int max_row=-1;
21      for(k=0;k<RR;k++)
22      {
23          i=0; j=-1;
24          next[k][0]=-1;
25          while(i<CC)
26          {
27              if(j==-1||str[k][i]==str[k][j])
28              {
29                  i++;
30                  j++;
31                  next[k][i]=j;
32              }
33              else j=next[k][j];
34          }
35          if(max_row<(CC-next[k][CC]))
36               max_row=(CC-next[k][CC]);
37      }
38      int max_cow=-1;
39      //求出所有列中的最小循环节
40      for(k=0;k<CC;k++)
41      {
42          i=0;
43          j=-1;
44          next[0][k]=-1;
45          while(i<RR)
46          {
47              if(j==-1||str[i][k]==str[j][k])
48              {
49                 i++;
50                 j++;
51                 next[i][k]=j;
52              }
53              else
54                  j=next[j][k];
55          }
56          if(max_cow<(RR-next[RR][k]))
57              max_cow=(RR-next[RR][k]);
58      }
59         printf("%d\n",max_row*max_cow);
60   }
61  return 0;
62 }

POJ--2158--------------Milking Grid(最小覆盖字符矩阵)---(开二维kmp)

时间: 2024-10-24 06:39:01

POJ--2158--------------Milking Grid(最小覆盖字符矩阵)---(开二维kmp)的相关文章

poj2185 Milking Grid (最小覆盖矩阵)

//给定一个由字符组成的矩阵,求出它的面积最小的覆盖矩阵 //可以求出每一行的最小覆盖子串的长度,只要对这些长度求最小公倍数,就可以获得最小覆盖矩阵的宽度. //同理,求出每一列的最小覆盖子串的长度,再求最小公倍数,就可以获得最小覆盖矩阵的高度了. # include <stdio.h> # include <string.h> # include <algorithm> using namespace std; char a[10010][100]; int next

poj 2185 Milking Grid(KMP)

题目链接:poj 2185 Milking Grid 题目大意:给定一个N?M的矩阵,找到一个最小的r?c的矩阵,使得原矩阵可以由若干个小矩阵组成,输出r?c的值. 解题思路:将行和列分别看成字符串,然后hash,对hash后的数组分别求KMP. #include <cstdio> #include <cstring> #include <algorithm> using namespace std; typedef unsigned long long ll; con

POJ 2185 Milking Grid KMP循环节周期

题目来源:id=2185" target="_blank">POJ 2185 Milking Grid 题意:至少要多少大的子矩阵 能够覆盖全图 比如例子 能够用一个AB 组成一个 ABABAB ABABAB 能够多出来 思路:每一行求出周期 总共n个 求这n个周期的最小公倍数 假设大于m 取m 每一列求出周期 总共m个求这个m个周期的最小公倍数 假设大于n取n 答案就是2个最小公倍数的积 #include <cstdio> #include <cst

POJ 2185 Milking Grid

Milking Grid Time Limit: 3000ms Memory Limit: 65536KB This problem will be judged on PKU. Original ID: 218564-bit integer IO format: %lld      Java class name: Main Every morning when they are milked, the Farmer John's cows form a rectangular grid th

POJ 2185 二维KMP

题意:就是让你求出最小的字符矩阵面积,这个矩阵是这个大矩阵里能够循环的,但是并不一定是全部循环相同的,部分相同也算循环,比如样例. 思路:这题挺好的,以前没有想到二维字符串数组也可以用next数组求出其循环节,现在这题正好补了这个空. 解法:把每一个字符串当做字符进行求next数组,然后求出最小的循环字符串长度,即:len-next[len].因为以前求循环节是len/(len-next[len]),括号里面的不就是最小的循环长度嘛! 因为要求这个循环矩阵的长和宽,所以长就是每一行作为一个字符串

根据矩阵的二维相关系数进行OCR识别

我想通过简单的模板匹配来进行图像识别. 把预处理好的字符图片,分别与A到J的样本图片进行模板匹配.结果最大的表明相关性最大,就可以识别字符图片了. 在实际应用中,我用了openCV的matchTemplate()函数,但是未达到我想要点的效果. matchTemplate()的功能是在图像中搜索出指定的模板,如果模板是从待搜索的图像中截取出来的,会有很好的效果.但是如果模板不是待搜素图像的一部分,似乎达不到我想要的效果. 在尝试了matlab的corr2()后,发现corr2能很好的解决我的问题

【c语言】二维数组中的查找,杨氏矩阵在一个二维数组中,每行都依照从左到右的递增的顺序排序,输入这种一个数组和一个数,推断数组中是否包括这个数

// 二维数组中的查找,杨氏矩阵在一个二维数组中.每行都依照从左到右的递增的顺序排序. // 每列都依照从上到下递增的顺序排序.请完毕一个函数,输入这种一个数组和一个数.推断数组中是否包括这个数 #include <stdio.h> #define col 4 #define rol 4 int yang(int(*p)[col], int num) { int i = 0; int j = col - 1; while (j+1) { int *q = &(p[i][j]); if

POJ 2185 Milking Grid (二维KMP next数组)

Milking Grid Time Limit: 3000MS   Memory Limit: 65536K Total Submissions: 6665   Accepted: 2824 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

Match:Milking Grid(二维kmp算法)(POJ 2185)

奶牛矩阵 题目大意:给定一个矩阵,要你找到一个最小的矩阵,这个矩阵的无限扩充的矩阵包含着原来的矩阵 思路:乍一看这一题确实很那做,因为我们不知道最小矩阵的位置,但是仔细一想,如果我们能把矩阵都放在左上角该多好,这样一来这一题好像又是循环数组那个样子了(二维的). 而事实上我们确实可以把所有情况都放在左上角,因为矩阵里面的元素的相对位置是不变的,这样一来我们就可以把矩阵看成都是一些元素从左上角往右下角扩充.那么现在问题就又回到了循环节的问题上了,我们可以把矩阵看成是很多很多个字符串组成,我们要找的