Milking Grid poj-2185

    题目大意:给出一个字符矩阵,求最小覆盖矩阵(可以残余).

    注释:$1\le R\le 10^5$,$1\le C \le 75$

      想法:和bzoj1355不同的是,bz那题求的是最小覆盖子串。这题其实异曲同工。Discuss中讲的还是蛮清楚的,就是我们对于每一行单独求出Next数组,然后跑出每一行的所有的可能覆盖子串,然后用桶遍历出一个最小值即可。最后的乘积就是答案。

    最后,附上丑陋的代码... ...

  1. #include <iostream>
  2. #include <stdio.h>
  3. #include <string.h>
  4. #include <algorithm>
  5. using namespace std;
  6. const int maxr=10002;
  7. const int maxc=80;
  8. char GetRead[maxr][maxc];
  9. int row,col;//行和列
  10. int rnext[maxr][maxc];//rnext[i]:对应第i行字符串的next函数
  11. int cnext[maxr];//求纵向的next,每次比较的是整行
  12. int rlen[maxr];//rlen[i]:第i行字符串的最小循环子串的长度
  13. int cnt[maxc];//cnt[i]:统计各宽度出现的次数
  14. int ans_for_col,ans_for_row;//最小覆盖矩阵的宽度和高度
  15. void rgetNext(int r,char*str)//
  16. {
  17. int k=0;
  18. rnext[r][1]=0;
  19. for(int i=1;i<col;i++)
  20. {
  21. while(k&&str[k]!=str[i])
  22. k=rnext[r][k];
  23. if(str[k]==str[i])
  24. k++;
  25. rnext[r][i+1]=k;
  26. }
  27. rlen[r]=col-rnext[r][col];
  28. int i;
  29. for(i=rlen[r];i<=col;i+=rlen[r])
  30. {
  31. cnt[i]++;
  32. }
  33. i-=rlen[r];
  34. for(int j=i+1;j<=col;j++)
  35. {
  36. int x=0,y=j;
  37. while(str[x]==str[y])
  38. {
  39. x++;y++;
  40. }
  41. if(y==col)
  42. cnt[j]++;
  43. }
  44. }
  45.  
  46. void GetNext()
  47. {
  48. int k=0;
  49. cnext[1]=0;
  50. for(int i=1;i<row;i++)
  51. {
  52. while(k&& strcmp(GetRead[k],GetRead[i])!=0)
  53. k=cnext[k];
  54. if(strcmp(GetRead[k],GetRead[i])==0)
  55. k++;
  56. cnext[i+1]=k;
  57. }
  58. ans_for_row=row-cnext[row];
  59. }
  60.  
  61. int main()
  62. {
  63. scanf("%d%d",&row,&col);
  64. for(int i=0;i<row;i++)
  65. {
  66. scanf("%s",GetRead[i]);
  67. }
  68. memset(cnt,0,sizeof(cnt));
  69. for(int i=0;i<row;i++)
  70. {
  71. rgetNext(i,GetRead[i]);
  72. }
  73. GetNext();
  74. for(int i=1;i<=col;i++)
  75. {
  76. if(cnt[i]==row)
  77. {
  78. ans_for_col=i;
  79. break;
  80. }
  81. }
  82. printf("%d\n",ans_for_col*ans_for_row);
  83. return 0;
  84. }

    小结:挺好的一道题,有意义。网上大部分的题解全都是假的,很多并不极限的数据就能卡死。

[poj2185]Milking Grid_KMP的更多相关文章

  1. poj2185 Milking Grid【KMP】

    Milking Grid Time Limit: 3000MS   Memory Limit: 65536K Total Submissions: 10084   Accepted: 4371 Des ...

  2. POJ2185 Milking Grid 【lcm】【KMP】

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

  3. 【kmp算法】poj2185 Milking Grid

    先对每行求出所有可能的循环节长度(不需要整除). 然后取在所有行中都出现了的,且最小的长度为宽. 然后将每一行看作字符,对所有行求next数组,将n-next[n](对这些行来说最小的循环节长度)作为 ...

  4. [USACO2003][poj2185]Milking Grid(kmp的next的应用)

    题目:http://poj.org/problem?id=2185 题意:就是要求一个字符矩阵的最小覆盖矩阵,可以在末尾不完全重合(即在末尾只要求最小覆盖矩阵的前缀覆盖剩余的尾部就行了) 分析: 先看 ...

  5. poj2185 Milking Grid

    题目链接:http://poj.org/problem?id=2185 这道题我看了好久,最后是通过参考kuangbin的博客才写出来的 感觉next数组的应用自己还是掌握的不够深入 这道题其实就是先 ...

  6. POJ2185 Milking Grid KMP两次(二维KMP)较难

    http://poj.org/problem?id=2185   大概算是我学KMP简单题以来最废脑子的KMP题目了 , 当然细节并不是那么多 , 还是码起来很舒服的 , 题目中描写的平铺是那种瓷砖一 ...

  7. POJ2185 Milking Grid 题解 KMP算法

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

  8. 【POJ2185】【KMP + HASH】Milking Grid

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

  9. Milking Grid poj2185

    Milking Grid POJ - 2185 时限: 3000MS   内存: 65536KB   64位IO格式: %I64d & %I64u 提交 状态 已开启划词翻译 问题描述 Eve ...

随机推荐

  1. Java获取当前的日期和时间

    Java获取当前的日期和时间 1.具体实现方法如下 /** * @Title:DateTime.java * @Package:com.you.model * @Description:获取当前的日期 ...

  2. const char *p;和char * const p的区别

    const char *p;       const修饰*p,所以*p是一个常量,不可修改. char* const p; const修饰p,所以指针p是一个常量,不可修改. #include< ...

  3. Educational Codeforces Round 36 (Rated for Div. 2) E. Physical Education Lessons

    提供两种思路 一种线段树区间更新 另一种用map维护连续的区间,也是题解的思路 第二种很难写(我太渣,看了别人的代码,发现自己写的太烦了) #include<iostream> #incl ...

  4. var dataObj=eval("("+data+")");//转换为json对象(解决在ajax返回json格式数据的时候明明正确的获取了返回值但是却就是进不去success方法的问题。格式错误)

    一,原理 1.1,解析1 将字符串解析为JavaScript代码,比如:var a = "alert('a');";这里的a就只是一个字符串而已,输出的话也是alert(a);这句 ...

  5. 【转】Swagger2 添加HTTP head参数

    大家使用swagger往往会和JWT一起使用,而一般使用jwt会将token放在head里,这样我们在使用swagger测试的时候并不方便,因为跨域问题它默认不能自定义head参数.然后自己去网上找, ...

  6. GridView中添加行单击事件.md

    [toc] 1.使用说明 1.方法来源 该方法主要参考StackOverflow上面的答案和下面这篇文章 http://www.codeproject.com/Articles/15677/Click ...

  7. Project入门学习

    Microsoft Office Project制定项目计划时,针对每项任务是可以分配具体的资源的,比如由某个人完成某项任务,或者把某项设备分配到某项任务,这样便于项目的管理和人员.设备的安排及有效利 ...

  8. Xampp apache与mySQL开不了 解决办法

    Xampp安装后,打开Xampp control panel. 点击Apache对应的Start,开不了.原因是系统的服务占用了80端口,所以要么结束系统服务,要么修改apache端口. 个人比较喜欢 ...

  9. Spring Boot Security 基于角色的访问控制

    @Override protected void configure(HttpSecurity http) throws Exception { //如果配置为需要登录 if (needLogin) ...

  10. 8Manage:数据安全,企业新时代的护航利器

    数据安全,是个老生常谈的话题,但是安全往往是在危险的时候方能体现出来,因此,这也是很容易被人们所忽略的部分.2017年,数据安全事件更是屡屡登上头条,除了个人信息的数据泄露之外,还有网络病毒造成的全球 ...