题意:给出一个字符矩形,问找到一个最小的字符矩形,令它无限复制之后包含原来的矩形。

此题用KMP+枚举来做。

一维的字符串匹配问题可以用KMP来解决。但是二维的就很难下手。我们可以将二维问题转化为一维来做。

首先可以发现这个最小的字符矩形一定是在左上角的。

这样我们对每列枚举它的前缀的长度,如果是能形成重复子串,就记录一下该长度。为了能形成矩形,统计出现R次的最短长度L(一定会有出现R次的长度,最坏的情况下这个长度是C)。

比如:

ABCABCABC(长度为3和9的前缀可以形成重复子串)

ABABABABA(长度为2、4和9的前缀可以形成重复子串)

只有长度为9的前缀在每行都出现了,所以最短长度L=9。

这样我们就得到了最小重复矩形的列数目。

然后将每行的字符串看作一个字符进行KMP,求next数组。它的周期就是R-next[R]。

最终答案就是L*(R-next[R])。

 #include<iostream>
 #include<cstring>
 #include<cstdio>
 using namespace std;
 ];
 ][];
 ];
 int r,c;
 void getFail()
 {
     ; i<r; ++i)
     {
         int j=next[i];
         while(j&&strcmp(str[i],str[j])) j=next[j];
         next[i+]=(!strcmp(str[i],str[j]))?j+:;
     }
 }
 ];
 bool match(char *a,char *b)
 {
     int la=strlen(a);
     ,j=; i<c; ++i,++j)
     {
         ;
         if(a[j]!=b[i]) return false;
     }
     return true;
 }
 int main()
 {
     while(scanf("%d%d",&r,&c)!=EOF)
     {
         ; i<r; ++i)
             scanf("%s",str[i]);
         memset(cnt,,sizeof(cnt));
         ; i<r; ++i)
         {
             ; j<c; ++j)
             {
                 word[j]=str[i][j];
                 word[j+]=;
                 if(match(word,str[i]))
                     cnt[j]++;
             }
         }
         getFail();
         int x=c,y=r-next[r];
         ; i<c; ++i)
             if(cnt[i]==r)
             {
                 x=i+;
                 break;
             }
         printf("%d\n",x*y);
     }
     ;
 }

POJ 2185 - Milking Grid (二维KMP)的更多相关文章

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

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

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

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

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

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

  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] Milking Grid 解题报告(KMP+最小循环节)

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

  6. POJ 2185 Milking Grid(KMP)

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

  7. 【KMP】POJ 2185 Milking Grid -- Next函数的应用

    题目链接:http://poj.org/problem?id=2185 题目大意:求一个二维的字符串矩阵的最小覆盖子矩阵,即这个最小覆盖子矩阵在二维空间上不断翻倍后能覆盖原始矩阵. 题目分析:next ...

  8. POJ 2185 Milking Grid KMP(矩阵循环节)

                                                            Milking Grid Time Limit: 3000MS   Memory Lim ...

  9. POJ 2185 Milking Grid [KMP]

    Milking Grid Time Limit: 3000MS   Memory Limit: 65536K Total Submissions: 8226   Accepted: 3549 Desc ...

随机推荐

  1. for( unsigned int i=heapSize/2-1; i>=0; --i)

    unsigned int的表示 今天在写堆排序的时候遇到一个BUG void builMaxHeap( int *arr,unsigned int heapSize){ unsigned int i; ...

  2. 你的java 代码对JIT编译友好吗?

    JIT编译器是Java虚拟机(以下简称JVM)中效率最高并且最重要的组成部分之一.但是很多的程序并没有充分利用JIT的高性能优化能力,很多开发者甚至也并不清楚他们的程序有效利用JIT的程度. 在本文中 ...

  3. 5.5 Selenium2中的元素定位

    WebDriver的更加面向对象的方式大大降低了Selenium的入门门槛,对Web元素的操作也非常之简单易学.实际项目用起来,工作量最大的部分就是你如何解析定位到你的目标项目页面中的各种元素.好比你 ...

  4. [maven] 跳过单元测试

    1.mvn命令 $ mvn install -Dmaven.test.skip=true 2.通过配置pom <project> [...] <build> <plugi ...

  5. 给Eclipse中hibernate.cfg.xml配置文件加提示

    在hibernate框架需要的jar包中找到hibernate3.jar,并用压缩软件打开,如图: 2 选择org文件夹--打开下一级文件夹 3 点击类型,方便找到dtd文件,下拉查看dtd文件,有两 ...

  6. Jquery异步提交$.ajax的使用

    function test(){ var myEntity=new Object(); myEntity.pro1="xxx"; myEntity.pro2=10; $.ajax( ...

  7. [整][转]Invoke和BeginInvoke的使用

    在Invoke或者BeginInvoke的使用中无一例外地使用了委托Delegate. 一.为什么Control类提供了Invoke和BeginInvoke机制? 关于这个问题的最主要的原因已经是do ...

  8. 转: CSS中float和clear的理解

    float:浮动,比如,默认的,我们知道,div是占满一行的,现在我们想把两个div显示在一行上,那怎么办呢<div style="width:100px;">1111 ...

  9. HDU 4890 One to Four(2014 Multi-University Training Contest 3)

    题意:给定一个长方形网格,要把它切成完全相同4个部分(这里完全相同指可以旋转平移后能重叠).把4个重叠后每个网格对应有四个数字相加,得到一种方案,所有格子中和最小就是该种方案的值,在多种方案中,最后问 ...

  10. C# 子窗体点击按钮产生的新子窗体放在父窗体里

    情景展示: 父窗体Form1,左边是按钮,右边是panel(放置子窗体) 父窗体点击按钮,在panel显示第一个子窗体AA, AA有个按钮,点击按钮,是第二个子窗体ZZ, 怎样将AA的子窗体ZZ也显示 ...