程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> POJ2185-Milking Grid(KMP,next數組的應用)

POJ2185-Milking Grid(KMP,next數組的應用)

編輯:C++入門知識

POJ2185-Milking Grid(KMP,next數組的應用)


Milking Grid Time Limit: 3000MS Memory Limit: 65536K Total Submissions: 6317 Accepted: 2648

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
題意:r*c的字符串,問用最小的面積的字符串去覆蓋它,求最小的面積 思路:可以分行分列考慮,容易想到當只考慮行的時候,只要把每一行看成一個字符,就可以求出關於行的next數組,然後求出最短的循環串 r-next[r] ,列也是如此,所以最終答案就是 (c-P[c])*(r-F[r]) P,F分別為各自的next數組。
#include 
#include 
#include 
#include 
#include 
#include 
#include 
using namespace std;
const int maxn = 10000+10;
const int maxm = 80;
char mat[maxn][maxm];
char revmat[maxm][maxn];
int r,c;
int P[maxn],F[maxn];
int gcd(int a,int b) {
    if(b==0) return a;
    else return gcd(b,a%b);
}
void getP() {
    P[1] = P[0] = 0;
    for(int i = 1; i < r; i++) {
        int j = P[i];
        while(j && strcmp(mat[i],mat[j])) j = P[j];
        if(strcmp(mat[i],mat[j])==0) P[i+1] = j+1;
        else P[i+1] = 0;
    }
}
void getF() {
    F[1] = F[0] = 0;
    for(int i = 1; i < c; i++) {
        int j = F[i];
        while(j && strcmp(revmat[i],revmat[j])) j = F[j];
        if(strcmp(revmat[i],revmat[j])==0) F[i+1] = j+1;
        else F[i+1] = 0;
    }
}
void getRev() {
    for(int i = 0; i < c; i++) {
        for(int j = 0; j < r; j++) {
            revmat[i][j] = mat[j][i];
        }
    }
}
void solve() {
    int L = r-P[r],R = c - F[c];
    printf("%d\n",L*R);
}
int main(){

    while(~scanf("%d%d",&r,&c)){
        for(int i = 0; i < r; i++) scanf("%s",mat[i]);
        getP();
        getRev();
        getF();
        solve();
    }
    return 0;
}


  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved