POJ 2185 Milking Grid

原创 2012年03月21日 22:04:42

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

题意:给你一个字符矩阵,求出它的最小覆盖子矩阵,即使得这个子矩阵的无限复制扩张之后的矩阵,能包含原来的矩阵。 即二维的最小覆盖子串。

思路:KMP很好的一道题。首先易证:最小覆盖子矩阵一定靠左上角。那么,我们考虑求出每一行的最小重复串长度,所有行的最小重复串的长度的lcm就是最小重复子矩阵的宽。然后我们对列也做相同的操作。于是我们就可以求得最小重复子矩阵的大小了。(这里要注意一点:当所得的宽大于原来的宽时,就让等于原来的宽,长也如此)。算法实现:算法的核心在于高效的求出每一行和每一列的最小重复串,这个可以最原串做一次KMP中的get_next()。(注:以上部分为转载)

#include<stdio.h>
#include<string.h>
char map[10005][80] ;
int N ,M ;
long long res1 ,res2 ; 
int next[10005] ;

long long gcd(long long a, long long b){
	if(b == 0)	return a ; 
	else return gcd(b,a%b);	
}
long long lcm(long long a, long long b){
	return a / gcd(a,b) * b ;			
}
void getnext_r(int r){
	int i, j ;
	next[0] = -1 ;
	i = 1 ; j = -1 ;
	for( ;i<M;i++ ){
		while(j!=-1 && map[r][i]!=map[r][j+1])
			j = next[j] ;
		if(map[r][i] == map[r][j+1])
			j++ ;	
		next[i] = j ;
	}	
	j = M - 1 ;
	long long l = j - next[j] ;
	res1 = lcm(res1 , l);
}
void getnext_c(int c){
	int i, j ;
	next[0] = -1 ;
	i = 1 ; j = -1 ;
	for( ;i<N;i++ ){
		while(j!=-1 && map[i][c]!=map[j+1][c])
			j = next[j] ;
		if(map[i][c] == map[j+1][c])	
			j++ ;	
		next[i] = j ;
	} 	
	j = N - 1 ;
	long long l = j - next[j] ;
	res2 = lcm(res2 , l );
}
int main(){
	while(scanf("%d %d",&N,&M) == 2){
		for(int i=0;i<N;i++){
			scanf("%s",map[i]);	
		}
		res1 = 1 ;
		for(int i=0;i<N;i++){	//	行 
			getnext_r(i);
			if(res1 > M){		//一旦大于M就取M
				res1 = M ; break ;	
			}
		}	
		res2 = 1 ;
		for(int j=0;j<M;j++){
			getnext_c(j);	
			if(res2 > N){		//一旦大于N,就去N , 这里WA了2次
				res2 = N ; break ;	
			}
		}
		printf("%lld\n",res1*res2);
	}	
	return 0 ;	
}



相关文章推荐

POJ 2185 Milking Grid 二维kmp

题意:给出一个矩阵,求最小的子矩阵,使得原矩阵包含在子矩阵的某个扩展中。 比如 ABABA ABABA 就是被包含在AB扩展的矩阵中。 输出这个最小的子矩阵的大小。 其实只要两遍KMP就行了,把每...
  • hcbbt
  • hcbbt
  • 2013年11月29日 13:08
  • 1809

【poj 2185 Milking Grid】 KMP*2

Milking Grid Time Limit: 3000MS Memory Limit: 65536K Total Submissions: 7365 Accepted: 31...
  • ALPS233
  • ALPS233
  • 2016年01月18日 20:54
  • 446

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

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

POJ 2185 - Milking Grid

题目地址: http://poj.org/problem?id=2185   KMP 。  求最小覆盖子矩阵。输出子矩阵面积。   利用求最小覆盖子串的方法。 不过应注意的是,因为有多行和多列...

POJ P2185 Milking Grid KMP变形

Milking Grid Time Limit: 3000MS   Memory Limit: 65536K Total Submissions: 5372   A...
  • kdwycz
  • kdwycz
  • 2014年01月26日 22:08
  • 632

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

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

poj 2185 : Milking Grid (KMP)

题意:给你一个字符矩阵,求出它的最小覆盖子矩阵,即使得这个子矩阵的无限复制扩张之后的矩阵,能包含原来的矩阵。 即二维的最小覆盖子串。一看这题,容易想出一种很直观的做法:求出每一行的最小重复串长度,取所...

poj2185 Milking Grid(KMP运用)

poj2185 Milking Grid(KMP运用)

poj 2185 Milking Grid(KMPnext数组的性质+lcm)

【题目大意】:给出一个n*m的字符矩阵,求出一个最小的子矩阵,使得其在不断复制后可以形成一个新的矩阵覆盖原矩阵。如下面的sanmple,最小的子矩阵是“AB”,经过复制后形成的矩阵是:ABABAB >...
  • new_wu
  • new_wu
  • 2012年03月19日 00:31
  • 535

POJ 2185 Milking Grid(KMP:循环节加强版)

POJ 2185 Milking Grid(KMP) http://poj.org/problem?id=2185 题意:给你一个R*C的字符矩阵,要你求最小的子矩阵,我们能通过不断重复该子矩阵从而得...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:POJ 2185 Milking Grid
举报原因:
原因补充:

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