题目链接: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的更多相关文章

  1. POJ 2185 Milking Grid KMP循环节周期

    题目来源:id=2185" target="_blank">POJ 2185 Milking Grid 题意:至少要多少大的子矩阵 能够覆盖全图 比如例子 能够用一 ...

  2. Milking Grid POJ - 2185 || 最小覆盖子串

    Milking Grid POJ - 2185 最小覆盖子串: 最小覆盖子串(串尾多一小段时,用前缀覆盖)长度为n-next[n](n-pre[n]),n为串长. 当n%(n-next[n])==0时 ...

  3. [poj 2185] Milking Grid 解题报告(KMP+最小循环节)

    题目链接:http://poj.org/problem?id=2185 题目: Description Every morning when they are milked, the Farmer J ...

  4. 二维KMP - 求字符矩阵的最小覆盖矩阵 - poj 2185

    Milking Grid Problem's Link:http://poj.org/problem?id=2185 Mean: 给你一个n*m的字符矩阵,让你求这个字符矩阵的最小覆盖矩阵,输出这个最 ...

  5. 【poj 2185】Milking Grid(字符串--KMP+问题分解)

    题意:给定一个由字符组成的矩阵,求出它的面积最小的覆盖矩阵.(感觉应该是可重叠的......* (・ω・)っ) 解法:KMP.行列互不影响,可以问题分解.先求出每一行的最小重复串,利用kmp中的nex ...

  6. POJ 2185 Milking Grid (KMP,求最小覆盖子矩阵,好题)

    题意:给出一个大矩阵,求最小覆盖矩阵,大矩阵可由这个小矩阵拼成.(就如同拼磁砖,允许最后有残缺) 正确解法的参考链接:http://poj.org/showmessage?message_id=153 ...

  7. POJ 2185 Milking Grid(KMP)

    Milking Grid Time Limit: 3000MS   Memory Limit: 65536K Total Submissions: 4738   Accepted: 1978 Desc ...

  8. POJ 2185 Milking Grid(KMP最小循环节)

    http://poj.org/problem?id=2185 题意: 给出一个r行c列的字符矩阵,求最小的覆盖矩阵可以将原矩阵覆盖,覆盖矩阵不必全用完. 思路: 我对于字符串的最小循环节是这么理解的: ...

  9. POJ 2185 Milking Grid [二维KMP next数组]

    传送门 直接转田神的了: Milking Grid Time Limit: 3000MS   Memory Limit: 65536K Total Submissions: 6665   Accept ...

随机推荐

  1. OWL库(叙词表构建本体OWL库)程序说明文档

    本体程序(叙词表转化OWL)及相关数据 程序已有资源:

  2. 【BZOJ】2038: [2009国家集训队]小Z的袜子(hose)

    [题意]给定n个数字ai,每次询问一个区间中随机抽选两个数字,数字相同的概率,以分数最简形式输出.n,ai<=50000. [算法]莫队算法 [题解]参考:莫队……讲稿? by Foreseea ...

  3. 洛谷 Sorting a Three-Valued Sequence 三值的排序

    Description 排序是一种很频繁的计算任务.现在考虑最多只有三值的排序问题.一个实际的例子是,当我们给某项竞赛的优胜者按金银铜牌序的时候. 在这个任务中可能的值只有三种1,2和3.我们用交换的 ...

  4. 关于linux的一些基础知识

    一.基础 1.linux所有内容以文件形式保存,包括硬件. 2.linux 不区分扩展名,靠权限区分.   #但是,约定 .sh脚本文件  .conf配置文件. 3.-rw-r--r--        ...

  5. CentOS7最小化安装连接到网络的解决方案

    周末在家想装个虚拟机学一下Hadoop啥的,因为网速小水管比较慢所以下载的是CentOS的minimal版本的: 这个版本安装完之后默认是没有安装net-tools的,也就是说ifconfig不能用: ...

  6. es6新语法Object.assign()

    1.介绍 Object.assign用于对象的合并,将源对象的所有可枚举属性复制到目标对象,只拷贝源对象自身的属性继承属性补考呗 Object.assign(target,source1,...)第一 ...

  7. 技巧之如何快速使用websocket来监控标准输出

    为啥是Websocket 服务端可以主动推送消息到浏览器端.比如服务端实时在打印日志,这是一个标准输出,可以实时将日志推送到浏览器. 为啥用websocketd (https://github.com ...

  8. adb_usb.ini在adb找不到设备时

    不能连接不上adb,如下方法解决,步骤描述不愿意看的话,直接使用本文最下面的批处理命令,方法copy粘贴到新建的bat文件里运行,或者直接粘贴到dos窗口运行. 1. 使用androidsdk目录中的 ...

  9. 190.Reverse Bits---位运算

    题目链接:https://leetcode.com/problems/reverse-bits/description/ 题目大意:将数值的二进制反转. 法一(借鉴):由于是无符号32位整型,当二进制 ...

  10. Python中如何Debug

    debug是编码是非常重要的调试技巧,通过在运行过程中设置断点,帮助开发人员更好的理解运行过程. Python中debug不像JAVA或者C++那样在IDE中设置断点那么直观. Python的debu ...