POJ 2185 (字符串最小覆盖)

原创 2012年03月29日 08:35:00
Milking Grid
Time Limit: 3000MS   Memory Limit: 65536K
Total Submissions: 3524   Accepted: 1446

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 

神题啊神题。。。太牛叉了

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

#define clear(a) memset(a,0,sizeof(a))

char st[10010][80],s_temp[10010];
int r,c,p[10010];

int in_data()
{
    int i;
    scanf("%d%d",&r,&c);
    for(i = 0;i < r;i++) scanf("%s",st[i]);
}

int gcd(int x,int y){
    if(y==0) return x;
    else return(gcd(y,x%y));
}

int lcm(int x,int y){
    return x*y/gcd(x,y);
}


int get_next(char s[],int len)
{
    int i,j,ans = len;
    clear(p);
    p[1] = 0;
    j = 0;
    for(i = 2;i <= len;i++) {
      while ((j > 0) && (s[j+1] != s[i]))
        j = p[j];
      if (s[j+1] == s[i])
        j++;
      p[i] = j;
      }
   // printf("%d\n",ans);
    return len - p[len];
}

int work()
{
   int i,j,lcm_r = 1,lcm_c = 1;
   for(i = 1;i <= r;i++) {
     for(j = 1;j <= c;j++)
       s_temp[j] = st[i-1][j-1];
       s_temp[c+1] = '\0';
     lcm_r = lcm(lcm_r,get_next(s_temp,c));
     if (lcm_r >= c) {lcm_r = c;break;}
     }
   for(j = 1;j <= c;j++) {
     for(i = 1;i <= r;i++)
       s_temp[i] = st[i-1][j-1];
       s_temp[r+1] = '\0';
     lcm_c = lcm(lcm_c,get_next(s_temp,r));
     if (lcm_c >= r) {lcm_c = r;break;}
     }
    //if (lcm_r > c) lcm_r = c;
    //if (lcm_c > r) lcm_c = r;
    return lcm_r * lcm_c;
}

int main()
{
    in_data();
    printf("%d\n",work());
    return 0;
}


poj 2185 Milking Grid (最小覆盖矩阵)

给一个字符矩阵,求最小覆盖矩阵的面积。 有一个结论:最小覆盖子串(串尾多一小段时,用前缀覆盖)长度为n-next[n](n-pre[n]),n为串长。 #include #include ...
  • u012936765
  • u012936765
  • 2015年03月20日 16:41
  • 404

poj3301--Texas Trip(最小正方形覆盖)

题目链接:点击打开链接 题目大意:给出n个点的坐标,现在要求一个正方形,完全包围n个点,并且正方形面积最小,求最小的正方形面积。 表示不能理解为什么面积随着角度的变化是一个单峰的函数,等待大牛告诉...
  • u013015642
  • u013015642
  • 2015年08月06日 19:14
  • 1166

poj2185

/*kmp的一道好题,ZOJ1905题的一道升华。 这道题目的核心就在于,先行匹配,取最小公倍数,再列匹配,取最小公倍数,两个一乘就是area。 这题有句话很重要,Note that the di...
  • nash142857
  • nash142857
  • 2012年08月23日 17:29
  • 1365

Java实现-最小子串覆盖

给定一个字符串source和一个目标字符串target,在字符串source中找到包括所有目标字符串字母的子串。  注意事项 如果在source中没有这样的子串,返回"",如果有多个这...
  • qq_14927217
  • qq_14927217
  • 2017年07月05日 10:56
  • 644

Minimum Window Substring 最小覆盖子串算法

题目  最小子串覆盖  描述 笔记  数据  评测 给定一个字符串source和一个目标字符串target,在字符串source中找到包括所有目标字符串字母的子串。 您在真...
  • fly_yr
  • fly_yr
  • 2016年04月12日 16:13
  • 3218

POJ2185 最小覆盖矩阵

给定一个由字符组成的矩阵,求出它的面积最小的覆盖矩阵。 最小覆盖矩阵类似于最小覆盖子串,只不过是扩展到二维而已。 最小覆盖子串必定是原串的前缀,对于矩阵,可以求出每一行的最小覆盖子串的长度,只要对...
  • alongela
  • alongela
  • 2012年11月18日 20:09
  • 2626

Lintcode 最小子串覆盖

给定一个字符串source和一个目标字符串target,在字符串source中找到包括所有目标字符串字母的子串。 说明 在答案的子串中的字母在目标字符串中是否需要具有相同的顺序? ——不需要。 ...
  • Hk_john
  • Hk_john
  • 2017年03月16日 21:21
  • 561

Minimum Window Substring(最小覆盖子串)【面试算法题】

leetcode:Minimum Window Substring(最小覆盖子串)【面试算法题】 分类: leetcode面试算法题2013-09-27 02:29 305人阅读 评论(...
  • pi9nc
  • pi9nc
  • 2013年09月27日 22:31
  • 1091

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

Milking Grid Time Limit: 3000MS   Memory Limit: 65536K Total Submissions: 4901   A...
  • opm777
  • opm777
  • 2013年08月05日 17:14
  • 937

poj 2185 Milking Grid(最小矩阵覆盖,二维 kmp 匹配)

题目:http://poj.org/problem?id=2185 题目大意:给你一个二维字符串矩阵,问你最小的覆盖矩阵的大小。 思路:好题啊,绝对的kmp好题!具体解题思想可以参考这个网址:ht...
  • u010794465
  • u010794465
  • 2013年10月09日 13:00
  • 564
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:POJ 2185 (字符串最小覆盖)
举报原因:
原因补充:

(最多只允许输入30个字)