题意:让你求一个最小的覆盖子矩阵。

分析:首先第一点是确定的:那就是这个子矩阵肯定位于左上角,然后按行考虑,求出每一行可能的重复子串的长度,然后取所有行都存在并且长度最短的长度最为最小子矩阵的宽,

最后按列队长度为宽的字符串进行一次kmp求出循环节的长度。

代码实现:

#include<cstdio>
#include<cstring>
#include<iostream>
using namespace std;
int n,m,windth,height;
char str[][];
int visited[],next[]; void solve()
{
int i,j;
for(i=;i<n;i++)
str[i][windth]='\0';
i=;j=-;next[]=-;
while(i<n)//按列进行kmp求出最小子矩阵的高
{
if(j==-||strcmp(str[i],str[j])==)
{
i++;j++;
next[i]=j;
}
else
j=next[j];
}
height=n-next[n];
printf("%d\n",windth*height);
} int main()
{
int i,j;
int x,y;
while(scanf("%d%d",&n,&m)!=EOF)
{
getchar();
memset(visited,,sizeof(visited));
for(i=;i<n;i++)//求出每一行都有的最小重复子串作为宽
{
scanf("%s",str[i]);
for(j=m;j>=;j--)
{
x=;y=;
for(;str[i][x]!='\0';x++,y++)
{
if(y==j)
y=;
if(str[i][x]!=str[i][y])
break;
}
if(str[i][x]=='\0')
visited[j]++;
}
}
for(i=;i<=m;i++)
if(visited[i]==n)
break;
windth=i;
solve();
}
return ;
}

poj 2185(二维kmp)的更多相关文章

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

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

  2. Match:Milking Grid(二维KMP算法)(POJ 2185)

    奶牛矩阵 题目大意:给定一个矩阵,要你找到一个最小的矩阵,这个矩阵的无限扩充的矩阵包含着原来的矩阵 思路:乍一看这一题确实很那做,因为我们不知道最小矩阵的位置,但是仔细一想,如果我们能把矩阵都放在左上 ...

  3. POJ 2185 - Milking Grid (二维KMP)

    题意:给出一个字符矩形,问找到一个最小的字符矩形,令它无限复制之后包含原来的矩形. 此题用KMP+枚举来做. 一维的字符串匹配问题可以用KMP来解决.但是二维的就很难下手.我们可以将二维问题转化为一维 ...

  4. 题解报告:poj 2185 Milking Grid(二维kmp)

    Description Every morning when they are milked, the Farmer John's cows form a rectangular grid that ...

  5. POJ_2185_二维KMP

    http://poj.org/problem?id=2185 求最小覆盖矩阵,把KMP扩展到二维,行一次,列一次,取最小覆盖线段相乘即可. #include<iostream> #incl ...

  6. POJ 1724 二维费用最短路

    题目大意:有N个城市,编号1-N有R条路,每条路(单向)的起点为Si,终点为Di,长度为Li,如果要走这条路需要花Ti的钱现在你只有K元钱,求在不超支的前提下,从1走到N需要的最短距离 这里总是希望路 ...

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

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

  8. POJ 2155 二维线段树 经典的记录所有修改再统一遍历 单点查询

    本来是想找一个二维线段树涉及懒惰标记的,一看这个题,区间修改,单点查询,以为是懒惰标记,敲到一半发现这二维线段树就不适合懒惰标记,你更新了某段的某列,但其实其他段的相应列也要打标记,但因为区间不一样, ...

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

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

随机推荐

  1. JavaWeb项目开发案例精粹-第4章博客网站系统-002辅助类及配置文件

    1. <?xml version="1.0" encoding="UTF-8"?> <web-app version="2.5&qu ...

  2. Python实现ssh批量登录并执行命令

    局域网内有一百多台电脑,全部都是linux操作系统,所有电脑配置相同,系统完全相同(包括用户名和密码),ip地址是自动分配的.现在有个任务是在这些电脑上执行某些命令,者说进行某些操作,比如安装某些软件 ...

  3. UML系列01之 UML用例图

    UML,全称是Unified Modeling Language,中文是"统一建模语言".通俗点说,UML是一种创建模型的语言. UML是在开发阶段,说明,可视化,构建和书写一个面 ...

  4. 解决yum错误Error: requested datatype primary not available

    服务器信息: [mvj3@sdk2 ~]$ cat /proc/version Linux version 2.6.18-194.el5 (mockbuild@ca-build10.us.oracle ...

  5. Android BroadcastReceiver实时监听电量

    Android系统中实时的监听手机电量以及开机启动功能都是通过BroadcastReceiver组件实现的.我们可以动态注册这个类的一个实例通过 Context.registerReceiver()方 ...

  6. Java Map各遍历方式的性能比较

    1. 阐述 对于Java中Map的遍历方式,很多文章都推荐使用entrySet,认为其比keySet的效率高很多.理由是:entrySet方法一次拿到所有key和value的集合:而keySet拿到的 ...

  7. python学习--抓取一个网页上图片

    #!/bin/python # download_pic.py # download picture import os import sys from urllib.request import u ...

  8. CListView虚拟列表

    首先说下虚拟列表出现的原因: 数据量比较小的时候,对于CListView控件可以直接使用InsertItem并配合SetItemText函数来插入并修改数据.这样操作很直接. 但是,如果数据量比较大了 ...

  9. 无开发经验,初学python

    1.无开发经验,初学python   如果你不会其他语言,python是你的第一门语言: A Byte of Python (简明python教程,这个有中文版简明 Python 教程)是非常好的入门 ...

  10. VMware中第一次启动mac遇到的错误及解决方案

    本文部分参考 http://blog.sina.com.cn/s/blog_938d86e90100z5ep.html 虚拟机版本:VMware-workstation-full-7.1.3-3242 ...