POJ 2185 kmp
题目链接:http://poj.org/problem?id=2185
题意:给出一个R*C(10000 * 75)的矩形字符串,然你求最小的不严格重复矩阵,比如,ABA,最小的重复矩阵是AB,经过复制ABAB,可以把ABA完全覆盖掉。
题解:
题意很好理解,首先我们应该清楚,最小重复字串一定实在左上角。我们可以找到宽的最小共同重复串,然后,我们就可以对高进行kmp。答案即为w*h的值。对于宽,我们可以暴力找,枚举每一行的所有起点为0的字串,判断该长度是否满足重复,然后,我们所有行的最小共同的重复字串,即为宽w,对于高,只需要进行一次kmp求最小重复字串即可。
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int maxn = 1e4 + ;
char s[maxn][], T[];
int net[maxn];
int bit[];
int R, C;
int main()
{
int ans = ;
scanf("%d%d", &R, &C);
for(int i = ; i < C; i++) bit[i] = ;
for(int i = ; i < R; i++)
{
scanf("%s", s[i]);
strcpy(T, s[i]);
for(int j = C - ; j >= ; j--)
{
T[j] = ;
int x = , y = ;
for(; s[i][y]; x++, y++)
{
if(!T[x]) x = ;
if(T[x] != s[i][y]) break;
}
if(!s[i][y]) bit[j]++;
}
}
for(int i = ; i < C; i++)
if(bit[i] == R)
{
ans = i;
break;
}
if(!ans) ans = C;
for(int i = ; i < R; i++)
s[i][ans] = ;
net[] = -;
int j = , k = -;
while(j < R)
{
if(k == - || !strcmp(s[k], s[j])) net[++j] = ++k;
else
k = net[k];
}
printf("%d\n", (R - net[R])*ans); //行列相乘即为最终结果
return ;
}
有一个优化:http://poj.org/showmessage?message_id=168710
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int maxn = 1e4 + ;
char s[maxn][], T[];
int net[maxn];
int bit[];
int R, C;
int main()
{
int ans = ;
scanf("%d%d", &R, &C);
for(int i = ; i < C; i++) bit[i] = ;
for(int i = ; i < R; i++)
{
scanf("%s", s[i]);
strcpy(T, s[i]);
for(int j = C - ; j >= ; j--)
{
T[j] = ;
int x = , y = ;
for(; s[i][y]; x++, y++)
{
if(!T[x]) x = ;
if(T[x] != s[i][y]) break;
}
if(!s[i][y]) bit[j]++;
}
}
for(int i = ; i < C; i++)
if(bit[i] == R)
{
ans = i;
break;
}
if(!ans) ans = C;
net[] = -;
int j = , k = -;
while(j < R)
{
if(k == - || !strcmp(s[k], s[j])) net[++j] = ++k;
else
k = net[k];
}
printf("%d\n", (R - net[R])*ans); //行列相乘即为最终结果
return ;
}
POJ 2185 kmp的更多相关文章
- POJ 2185 Milking Grid KMP循环节周期
题目来源:id=2185" target="_blank">POJ 2185 Milking Grid 题意:至少要多少大的子矩阵 能够覆盖全图 比如例子 能够用一 ...
- Milking Grid POJ - 2185 || 最小覆盖子串
Milking Grid POJ - 2185 最小覆盖子串: 最小覆盖子串(串尾多一小段时,用前缀覆盖)长度为n-next[n](n-pre[n]),n为串长. 当n%(n-next[n])==0时 ...
- [poj 2185] Milking Grid 解题报告(KMP+最小循环节)
题目链接:http://poj.org/problem?id=2185 题目: Description Every morning when they are milked, the Farmer J ...
- 二维KMP - 求字符矩阵的最小覆盖矩阵 - poj 2185
Milking Grid Problem's Link:http://poj.org/problem?id=2185 Mean: 给你一个n*m的字符矩阵,让你求这个字符矩阵的最小覆盖矩阵,输出这个最 ...
- 【poj 2185】Milking Grid(字符串--KMP+问题分解)
题意:给定一个由字符组成的矩阵,求出它的面积最小的覆盖矩阵.(感觉应该是可重叠的......* (・ω・)っ) 解法:KMP.行列互不影响,可以问题分解.先求出每一行的最小重复串,利用kmp中的nex ...
- POJ 2185 Milking Grid (KMP,求最小覆盖子矩阵,好题)
题意:给出一个大矩阵,求最小覆盖矩阵,大矩阵可由这个小矩阵拼成.(就如同拼磁砖,允许最后有残缺) 正确解法的参考链接:http://poj.org/showmessage?message_id=153 ...
- POJ 2185 Milking Grid(KMP)
Milking Grid Time Limit: 3000MS Memory Limit: 65536K Total Submissions: 4738 Accepted: 1978 Desc ...
- POJ 2185 Milking Grid(KMP最小循环节)
http://poj.org/problem?id=2185 题意: 给出一个r行c列的字符矩阵,求最小的覆盖矩阵可以将原矩阵覆盖,覆盖矩阵不必全用完. 思路: 我对于字符串的最小循环节是这么理解的: ...
- POJ 2185 Milking Grid [二维KMP next数组]
传送门 直接转田神的了: Milking Grid Time Limit: 3000MS Memory Limit: 65536K Total Submissions: 6665 Accept ...
随机推荐
- .NET Core get started on Ubuntu 14.04
昨天.NET Core 1.0 正式发布了,所以尝尝鲜. 根据官方介绍页面的步骤: 步骤1. sudo sh -c 'echo "deb [arch=amd64] https://apt-m ...
- jQuery经典面试题及答案精选[转]
这两天有个面试,把这些记在这里. 问题:jQuery的美元符号$有什么作用? 回答:其实美元符号$只是”jQuery”的别名,它是jQuery的选择器,如下代码: $(document).ready( ...
- input复选框checkbox默认样式纯css修改
修改之前的样式 修改之后的样式 html <input type="checkbox" name="btn" id="btn1"&g ...
- Django之组合搜索组件(二)--另附simple_tag的创建使用方法
这次的代码为Django之组合搜索组件(一)的改版,实现的结果和(一)相同,不同的是,这次运用simple_tag方式,使.html程序简化 所以现在就开始编程吧! 首先想使用simple_tag方法 ...
- perl6 登录phpmyadmin
use HTTP::UserAgent; my $ua = HTTP::UserAgent.new; my $url = 'http://localhost/phpMyAdmin/index.php' ...
- Linux内核中的常用宏container_of其实很简单【转】
转自:http://blog.csdn.net/npy_lp/article/details/7010752 开发平台:Ubuntu11.04 编 译器:gcc version 4.5.2 (Ubun ...
- juery获取元素的方法
1 从集合中通过指定的序号获取元素 html: 复制代码 代码如下: <div> <p>0</p> <p>1</p> <p>2& ...
- MySQL-IN和Exists区别
1.in和exists in是把外表和内表作hash连接,而exists是对外表作loop循环,每次loop循环再对内表进行查询.一直以来认为exists比in效率高的说法是不准确的. exists ...
- mini_httpd在RedHat 5下安装
1.安装mini_httpdcd /usr/src/redhat/SOURCES wget http://www.acme.com/software/mini_httpd/mini_httpd-1.1 ...
- 实习day2:@2X图片,git,coding.net,
@2X是5和6系列的图片,@3X是6P等大屏的图片 本公司目前只用@2X的图片适配. 比如20X27的图片 1x, 就是原始大小: 用2X, 就除以2,变成10X13.5: 如果用3X的, 就除以3, ...