http://poj.org/problem?id=2185

题意:求最小的模式块,使其无限扩展后包含给你的矩阵块(看别人题解才懂的题意);

分析:假设存在一个模式块可以满足上述条件,那么必然存在一个起点在(0,0)的模式块满足上述条件;

  对于每一行,我们找出所有可以满足条件的前缀记录下长度,那么满足所有行的最短的长度就是该模式块的宽r;

  对于模式块的长,我们把宽r的字符串压缩看出一个字符,然后再进行KMP,找出该字符串的最小循环串,即长l;

答案就是r * l;

  1. #include<cstdio>
  2. #include<cstring>
  3. #include<iostream>
  4. #include<vector>
  5. #include<cmath>
  6. #include<algorithm>
  7. #include<cmath>
  8. #include<cstdlib>
  9. using namespace std;
  10. const int N = +;
  11. int f[N];
  12. void getFail(char *s,int f[]) {
  13. int m = strlen(s);
  14. f[] = -;
  15. for (int i = ; i < m; i++) {
  16. int j = f[i-];
  17. while (j != - && s[j+] != s[i]) j = f[j];
  18. if (s[j+] == s[i]) j++;
  19. f[i] = j;
  20. }
  21. // for (int i = 0; i < m; i++) cout<<f[i]<<" ";cout<<endl;
  22. }
  23. int n,m;
  24. char mz[N][];
  25. int cnt[N];
  26. int check(char *s,int x) {
  27. int j = ;
  28. for (int i = ; i < m; i++) {
  29. if (s[i] != s[j]) return ;
  30. j++;
  31. if (j > x) j = ;
  32. }
  33. return ;
  34. }
  35. void solve(int r){
  36. f[] = -;
  37. for (int i = ; i < n; i++) {
  38. int j = f[i-];
  39. while (j != - && strcmp(mz[j+],mz[i])) j = f[j];
  40. if (strcmp(mz[j+],mz[i]) == ) j++;
  41. f[i] = j;
  42. }
  43. // for (int i = 0; i < n; i++) cout<<f[i]<<" ";cout<<endl;
  44. printf("%d\n",(n - - f[n-]) * (r));
  45. }
  46. int main(){
  47. // getFail("ababab",f);
  48. while (~scanf("%d%d",&n,&m)) {
  49. memset(cnt,,sizeof(cnt));
  50.  
  51. for (int i = ; i < n; i++) {
  52. scanf("%s",mz[i]);
  53. getFail(mz[i],f);
  54. int j = m-;
  55. while (j != -) {
  56. // cout<<m - 1 - f[j]<<endl;
  57. cnt[m - - f[j]]++;
  58. j = f[j];
  59. }
  60. }
  61. int r = ;
  62. for (int i = ; i <= m; i++) if (cnt[i] == n) {
  63. r = i; break;
  64. }
  65. for (int i = ; i < n; i++) {
  66. mz[i][r] = ;
  67. }
  68.  
  69. solve(r);
  70. }
  71. return ;
  72. }

poj 2185的更多相关文章

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

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

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

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

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

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

  4. poj 2185 Milking Grid

    Milking Grid http://poj.org/problem?id=2185 Time Limit: 3000MS   Memory Limit: 65536K       Descript ...

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

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

  6. POJ 2185 kmp

    题目链接:http://poj.org/problem?id=2185 题意:给出一个R*C(10000 * 75)的矩形字符串,然你求最小的不严格重复矩阵,比如,ABA,最小的重复矩阵是AB,经过复 ...

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

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

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

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

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

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

随机推荐

  1. Direct2D处理几何图形之间的碰撞检测(下)

    转载请注明出处:http://www.cnblogs.com/Ray1024 一.概述 上一篇文章中我们介绍了几何图形与点的碰撞检测.几何图形与点的位置关系比较简单:点在几何图形内.点在几何图形外.点 ...

  2. vim使用技巧(插入,删除,查找,复制,粘贴,剪切)

    原文链接:http://blog.csdn.net/qq_38646470/article/details/79643000 编程人员很喜欢的编辑器:vim 先搞清楚vim的三种模式: 1.命令模式: ...

  3. 通过Jmeter对Dubbo接口进行接口及性能测试

    dubbo接口/性能测试 dubbo简介 zookeeper简介.安装及配置 dubbo服务端demo dubbo客户端调用 jmeter工程改造及接口调用 读取jmeter参数用于dubbo性能测试 ...

  4. C#多线程的几种使用

    参见链接   :http://www.jb51.net/article/46234.htm

  5. Datawhale MySQL 训练营 Task4 表联结

    学习内容 MySQL别名 列别名,将查询或者筛选出来列用AS 命名,如果有空格则需要引号 '' SELECT xxx AS xxxx FROM WHERE GROUP BY HAVING 表别名, 把 ...

  6. __construct 与 __destruct 区别

    其实这个问法是有问题的,__construct 与 __destruct 没什么可比性,两个方法一个在对象被创建的时候触发,另一个在对象被销毁的时候触发 具体可以翻阅PHP官方手册中的 http:// ...

  7. (第七周)评论alpha发布

    本人所在组:奋斗吧兄弟 按课上展示组的顺序对其他组进行点评: 1.  新蜂 项目:游戏俄罗斯方块 界面完善,已经实现了游戏的基本功能.可以对图形进行变换形状,进行位置移动,可以加快下落的速度,并对一整 ...

  8. 对cnblogs.com的用户体验

    1.你是什么样的用户, 有什么样的心理, 对cnblogs 的期望值是什么? 我们是计算机专业学生,是奔向神奇的代码世界的旅人.希望在cnblogs上找到自己感兴趣的技术,并学到更多的知识,提升自己的 ...

  9. C++:new&delete

    一.new的浅析 在C++中,new主要由三种形式:new operator.operator new和placement new • new operator new operator即一些C++书 ...

  10. Myeclipse2014 用Maven创建第一个web项目(1)---helloworld

    一.创建项目 1.Eclipse中用Maven创建项目 2.继续Next 3.选maven-archetype-webapp后,next 4.填写相应的信息,Packaged是默认创建一个包,不写也可 ...