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)

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

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

题目:http://poj.org/problem?id=2185 题目大意:给你一个二维字符串矩阵,问你最小的覆盖矩阵的大小。 思路:好题啊,绝对的kmp好题!具体解题思想可以参考这个网址:ht...
  • u010794465
  • u010794465
  • 2013年10月09日 13:00
  • 553

poj2112Optimal Milking(最优秀的挤奶方案)——floyd+最大流+二分

http://poj.org/problem?id=2112题目描述: 农场主John 将他的K(1≤K≤30)个挤奶器运到牧场,在那里有C(1≤C≤200)头奶牛,在奶 牛和挤奶器之间有一组不同...
  • u014141559
  • u014141559
  • 2015年02月11日 20:40
  • 524

POJ Milking Grid 【最小覆盖矩阵,next[]】

Milking Grid Time Limit: 3000MS   Memory Limit: 65536K Total Submissions: 6829   A...
  • hpuhjh
  • hpuhjh
  • 2015年04月23日 19:39
  • 300

POJ1274:The Perfect Stall(二分图最大匹配 匈牙利算法)

The Perfect Stall Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 17895   Accepte...
  • u013487051
  • u013487051
  • 2014年07月10日 15:33
  • 1263

[POJ]2185 真正的正解

所谓正解?(伪) 1.求的所有行的循环节求max值,再求列的循环节的max值,两者相乘. 反例: 2 6 ABCDAB ABCABC 用1求出来是...
  • MaxMercer
  • MaxMercer
  • 2017年07月27日 08:33
  • 178

学习MySQL中遇到的问题(net start mysql; 服务名无效。 请键入 NET HELPMSG 2185 以获得更多的帮助)

首先,我装的mysql 5.7,在配置好my-deault.ini文件后, 感觉配置好所有的问题之后,在任务管理器里(管理员权限),输入net start mysql,输出的却是 ...
  • dingbu083146
  • dingbu083146
  • 2017年06月19日 10:34
  • 5307

poj 2112 Optimal Milking 【最大流 简单题】 【floyd预处理最短路 + 二分 + 最大流】

Optimal Milking Time Limit: 2000MS   Memory Limit: 30000K Total Submissions: 13910 ...
  • chenzhenyu123456
  • chenzhenyu123456
  • 2015年08月06日 18:24
  • 370

POJ 2185 KMP (最小循环模块)

/*题意:求最小循环模块的面积 必然存在一个最小循环模块的起点为(0,0), 对于每一行,对每一个循环串的长度做记录,满足所有行条件的最短长度即为宽b 对于长度,颗粒利用strcmp把每一行的字符串看...
  • a593547438
  • a593547438
  • 2014年04月07日 14:16
  • 651

poj 2112 Optimal Milking(二分搜索+最大流)

题目链接:http://poj.org/problem?id=2112 题目大意: 有K台挤奶机器(1...K编号)和C头奶牛(K+1...K+C编号),每台挤奶机器可以给M头奶牛挤奶; ...
  • cha1_cool
  • cha1_cool
  • 2013年07月31日 21:16
  • 287
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:POJ 2185 Milking Grid
举报原因:
原因补充:

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