【kmp算法】poj2185 Milking Grid

先对每行求出所有可能的循环节长度(不需要整除)。

然后取在所有行中都出现了的,且最小的长度为宽。

然后将每一行看作字符,对所有行求next数组,将n-next[n](对这些行来说最小的循环节长度)作为长。

最后输出长乘宽即可。

#include<cstdio>
#include<cstring>
using namespace std;
bool can[10010][80];
char s[10010][80];
int next[80],n,m,wide,NEXT[10010];
void GetFail(char P[],int next[])//next[i]表示s[0]~s[i-1]的前缀中,最大相等的前后缀的长度是多少
{
    next[0]=-1;
    int len=strlen(P);
    for(int i=0;i<len;i++)
      {
        int j=next[i];
        while(j>=0 && P[i]!=P[j])
          j=next[j];
        if(j!=-1 && P[i]==P[j])
          next[i+1]=j+1;
        else next[i+1]=0;
      }
}
int main()
{
//	freopen("poj2185.in","r",stdin);
	scanf("%d%d",&n,&m);
	for(int i=0;i<n;++i)
	  {
	  	scanf("%s",s[i]);
	  	GetFail(s[i],next);
	  	for(int j=next[m];j!=-1;j=next[j])
	  	  can[i][m-j]=1;
	  }
	for(int j=1;j<=m;++j)
	  {
	  	bool flag=1;
	  	for(int i=0;i<n;++i)
	  	  if(!can[i][j])
	  	    {
	  	      flag=0;
	  	      break;
	  	    }
	  	if(flag)
	  	  {
	  	  	wide=j;
	  	  	break;
	  	  }
	  }
	for(int i=0;i<n;++i)
	  s[i][wide]=‘\0‘;
	next[0]=-1;
    int len=n;
    for(int i=0;i<len;i++)
      {
        int j=next[i];
        while(j>=0 && strcmp(s[i],s[j])!=0)
          j=next[j];
        if(j!=-1 && strcmp(s[i],s[j])==0)
          next[i+1]=j+1;
        else next[i+1]=0;
      }
    printf("%d\n",wide*(n-next[n]));
	return 0;
}
时间: 2024-11-08 21:26:44

【kmp算法】poj2185 Milking Grid的相关文章

poj2185 Milking Grid(KMP运用)

题目链接:http://poj.org/problem?id=2185 Milking Grid Time Limit: 3000MS   Memory Limit: 65536K Total Submissions: 6249   Accepted: 2616 Description Every morning when they are milked, the Farmer John's cows form a rectangular grid that is R (1 <= R <= 1

poj2185 Milking Grid (最小覆盖矩阵)

//给定一个由字符组成的矩阵,求出它的面积最小的覆盖矩阵 //可以求出每一行的最小覆盖子串的长度,只要对这些长度求最小公倍数,就可以获得最小覆盖矩阵的宽度. //同理,求出每一列的最小覆盖子串的长度,再求最小公倍数,就可以获得最小覆盖矩阵的高度了. # include <stdio.h> # include <string.h> # include <algorithm> using namespace std; char a[10010][100]; int next

【POJ2185】【KMP + HASH】Milking Grid

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 wri

POJ2185 Milking Grid(KMP)

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

POJ2185 Milking Grid【KMP】

题目链接: http://poj.org/problem?id=2185 题目大意: 有一个N行M列的字符矩阵,这个字符矩阵可以由较小的矩阵重复平铺组成整个矩阵.问: 最小的字符子矩阵的面积为多少. 思路: 对于长度为M的每一行s[i]来说,M-Next[M],M-Next[Next[M]],-都是能通过复制,完 全覆盖字符串的可行串,而M-Next[M]是最小的.遍历每一行,求出对所有s[i]都可行的最 小字符串长度,即每一行M-Next[M]的最小公倍数lcmn.再用类似的方法求出长度为N.

Milking Grid poj2185

Milking Grid POJ - 2185 时限: 3000MS   内存: 65536KB   64位IO格式: %I64d & %I64u 提交 状态 已开启划词翻译 问题描述 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.

poj 2185 Milking Grid(KMP)

题目链接:poj 2185 Milking Grid 题目大意:给定一个N?M的矩阵,找到一个最小的r?c的矩阵,使得原矩阵可以由若干个小矩阵组成,输出r?c的值. 解题思路:将行和列分别看成字符串,然后hash,对hash后的数组分别求KMP. #include <cstdio> #include <cstring> #include <algorithm> using namespace std; typedef unsigned long long ll; con

POJ 2185 Milking Grid KMP循环节周期

题目来源:id=2185" target="_blank">POJ 2185 Milking Grid 题意:至少要多少大的子矩阵 能够覆盖全图 比如例子 能够用一个AB 组成一个 ABABAB ABABAB 能够多出来 思路:每一行求出周期 总共n个 求这n个周期的最小公倍数 假设大于m 取m 每一列求出周期 总共m个求这个m个周期的最小公倍数 假设大于n取n 答案就是2个最小公倍数的积 #include <cstdio> #include <cst

POJ 2185 Milking Grid (二维KMP next数组)

Milking Grid Time Limit: 3000MS   Memory Limit: 65536K Total Submissions: 6665   Accepted: 2824 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