POJ 2185 Milking Grid (KMP,GCD)

http://poj.org/problem?id=2185

求最小覆盖子矩阵的面积,求出每行的最小覆盖子串,求最小公倍数,就是矩阵的长度

求出每列的最小覆盖子矩阵然后求最小公倍数,就是矩阵的宽

最小覆盖字串的长度 ans=len-next[len];  http://blog.csdn.net/fjsd155/article/details/6866991

代码:

#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
#define nMAX 10005
#define mMAX 78
using namespace std;
char s[nMAX][mMAX];
int next[nMAX],r,c;
int get_next1(int x)
{
    int i,j;
    next[0]=-1;
    i=0,j=-1;
    while(i<c)
    {
        if(j==-1||s[x][i]==s[x][j])
        {
            i++,j++;
            next[i]=j;
        }
        else j=next[j];
    }
    return c-next[c];
}
int get_next2(int y)
{
   int i,j;
   next[0]=-1;
   i=0,j=-1;
   while(i<r)
   {
       if(j==-1||s[i][y]==s[j][y])
       {
           i++,j++;
           next[i]=j;
       }
       else j=next[j];
   }
   return r-next[r];
}
int gcd(int a,int b)
{
    int t;
    while(b!=0){t=a;a=b;b=t%b;}
    return a;
}
int lcm(int a,int b)
{
    return a*b/gcd(a,b);
}
int main()
{
    int k,i;
    while(~scanf("%d%d",&r,&c))
    {
        getchar();
        for(k=0;k<r;k++)
            scanf("%s",s[k]);
        int a,b,la,lb;
        a=get_next1(0);
        for(i=1;i<r;i++)
        {
            b=get_next1(i);
            a=lcm(a,b);
        }
        la=a;
        a=get_next2(0);
        for(i=1;i<c;i++)
        {
            b=get_next2(i);
            a=lcm(a,b);
        }
        lb=a;
        if(la>c)la=c;
        if(lb>r)lb=r;
        printf("%d\n",la*lb);
    }
    return 0;
}

  

  

posted @ 2012-08-10 11:41  快乐.  阅读(163)  评论(0编辑  收藏  举报