[poj2185]Milking Grid_KMP
Milking Grid poj-2185
题目大意:给出一个字符矩阵,求最小覆盖矩阵(可以残余).
注释:$1\le R\le 10^5$,$1\le C \le 75$
想法:和bzoj1355不同的是,bz那题求的是最小覆盖子串。这题其实异曲同工。Discuss中讲的还是蛮清楚的,就是我们对于每一行单独求出Next数组,然后跑出每一行的所有的可能覆盖子串,然后用桶遍历出一个最小值即可。最后的乘积就是答案。
最后,附上丑陋的代码... ...
#include <iostream>
#include <stdio.h>
#include <string.h>
#include <algorithm>
using namespace std;
const int maxr=10002;
const int maxc=80;
char GetRead[maxr][maxc];
int row,col;//行和列
int rnext[maxr][maxc];//rnext[i]:对应第i行字符串的next函数
int cnext[maxr];//求纵向的next,每次比较的是整行
int rlen[maxr];//rlen[i]:第i行字符串的最小循环子串的长度
int cnt[maxc];//cnt[i]:统计各宽度出现的次数
int ans_for_col,ans_for_row;//最小覆盖矩阵的宽度和高度
void rgetNext(int r,char*str)//
{
int k=0;
rnext[r][1]=0;
for(int i=1;i<col;i++)
{
while(k&&str[k]!=str[i])
k=rnext[r][k];
if(str[k]==str[i])
k++;
rnext[r][i+1]=k;
}
rlen[r]=col-rnext[r][col];
int i;
for(i=rlen[r];i<=col;i+=rlen[r])
{
cnt[i]++;
}
i-=rlen[r];
for(int j=i+1;j<=col;j++)
{
int x=0,y=j;
while(str[x]==str[y])
{
x++;y++;
}
if(y==col)
cnt[j]++;
}
} void GetNext()
{
int k=0;
cnext[1]=0;
for(int i=1;i<row;i++)
{
while(k&& strcmp(GetRead[k],GetRead[i])!=0)
k=cnext[k];
if(strcmp(GetRead[k],GetRead[i])==0)
k++;
cnext[i+1]=k;
}
ans_for_row=row-cnext[row];
} int main()
{
scanf("%d%d",&row,&col);
for(int i=0;i<row;i++)
{
scanf("%s",GetRead[i]);
}
memset(cnt,0,sizeof(cnt));
for(int i=0;i<row;i++)
{
rgetNext(i,GetRead[i]);
}
GetNext();
for(int i=1;i<=col;i++)
{
if(cnt[i]==row)
{
ans_for_col=i;
break;
}
}
printf("%d\n",ans_for_col*ans_for_row);
return 0;
}
小结:挺好的一道题,有意义。网上大部分的题解全都是假的,很多并不极限的数据就能卡死。
[poj2185]Milking Grid_KMP的更多相关文章
- poj2185 Milking Grid【KMP】
Milking Grid Time Limit: 3000MS Memory Limit: 65536K Total Submissions: 10084 Accepted: 4371 Des ...
- POJ2185 Milking Grid 【lcm】【KMP】
Description Every morning when they are milked, the Farmer John's cows form a rectangular grid that ...
- 【kmp算法】poj2185 Milking Grid
先对每行求出所有可能的循环节长度(不需要整除). 然后取在所有行中都出现了的,且最小的长度为宽. 然后将每一行看作字符,对所有行求next数组,将n-next[n](对这些行来说最小的循环节长度)作为 ...
- [USACO2003][poj2185]Milking Grid(kmp的next的应用)
题目:http://poj.org/problem?id=2185 题意:就是要求一个字符矩阵的最小覆盖矩阵,可以在末尾不完全重合(即在末尾只要求最小覆盖矩阵的前缀覆盖剩余的尾部就行了) 分析: 先看 ...
- poj2185 Milking Grid
题目链接:http://poj.org/problem?id=2185 这道题我看了好久,最后是通过参考kuangbin的博客才写出来的 感觉next数组的应用自己还是掌握的不够深入 这道题其实就是先 ...
- POJ2185 Milking Grid KMP两次(二维KMP)较难
http://poj.org/problem?id=2185 大概算是我学KMP简单题以来最废脑子的KMP题目了 , 当然细节并不是那么多 , 还是码起来很舒服的 , 题目中描写的平铺是那种瓷砖一 ...
- POJ2185 Milking Grid 题解 KMP算法
题目链接:http://poj.org/problem?id=2185 题目大意:求一个二维的字符串矩阵的最小覆盖子矩阵,即这个最小覆盖子矩阵在二维空间上不断翻倍后能覆盖原始矩阵. 题目分析:next ...
- 【POJ2185】【KMP + HASH】Milking Grid
Description Every morning when they are milked, the Farmer John's cows form a rectangular grid that ...
- Milking Grid poj2185
Milking Grid POJ - 2185 时限: 3000MS 内存: 65536KB 64位IO格式: %I64d & %I64u 提交 状态 已开启划词翻译 问题描述 Eve ...
随机推荐
- dojo实现省份地市级联---省份数据源
province.json: { "identifier": "id", "label": "name", " ...
- R语言与格式、日期格式、格式转化
每每以为攀得众山小,可.每每又切实来到起点,大牛们,缓缓脚步来俺笔记葩分享一下吧,please~ --------------------------- R语言的基础包中提供了两种类型的时间数据,一类 ...
- MyEclipse之Widget is disposed
1 错误描述 2 错误原因 3 解决办法
- (三十二)虚拟机linux系统中安装firefox浏览器
这几天,第二轮项目迭代进入了尾声,同时也接到了上司领导交代下来的新任务,那就是要我们学习linux系统基础的知识,包括常用命令和web应用的部署问题,于是乎安装了虚拟机和linux操作系统. 我安装的 ...
- Java中的throw和throws的区别
Java中的throw和throws的区别 1.throw关键字用于方法体内部,而throws关键字用于方法体部的方法声明部分: 2.throw用来抛出一个Throwable类型的异常,而throws ...
- Unity3d开发中与oc交互之类型转换
对于非科班出身的程序来说,在没有学过C和OC的情况,用unity开发iOS相关的功能,是非常痛苦的.简单写一下自己遇到的,并且没有百度到的坑. 1.C#给OC传递字典 一般流程是,C#调用C,C调用O ...
- C#图解教程 第八章 表达式和运算符
表达式和运算符 表达式字面量 整数字面量实数字面量字符字面量字符串字面量 求值顺序 优先级结合性 简单算术运算符求余运算符关系比较运算符和相等比较运算符递增运算符和递减运算符条件逻辑运算符逻辑运算符移 ...
- StringBuilder的实现与技巧(转)
1.Length 0.说明 在上一篇进一步了解String 中,发现了string的不便之处,而string的替代解决方案就是StringBuilder的使用 它的使用也很简单 System.Te ...
- 浏览器全屏之requestFullScreen全屏与F11全屏
一.简介 浏览器全屏有两种方式,一种是HTML5新增的requestFullscree全屏,另一种是摁F11实现的全屏,本文将详解两种全屏的特点以及实现代码. 二.requestFullscreen全 ...
- 期望$DP$ 方法总结
期望\(DP\) 方法总结 这个题目太大了,变化也层出不穷,这里只是我的一点心得,不定期更新! 1. 递推式问题 对于无穷进行的操作期望步数问题,一般可用递推式解决. 对于一个问题\(ans[x]\) ...