NKOJ3807 卜拉美古塔与最小表示法
时间限制 : - MS 空间限制 : 165536 KB
评测说明 : 1000ms

问题描述
/*
婆罗摩笈多先生在中国也十分著名,并且更加著名的是一个以他的名字命名的定理:
若圆内接四边形ABCD的对角线AC⊥BD,垂足为M。EF⊥BC,且M在EF上。那么F是AD的中点。
但鲜有人知道,相较于婆罗摩笈多,卜拉美古塔是一个更加富有艺术感的译名。这个译名使他的他的定理听起来更加优美——卜拉美古塔定理。
不管怎样,这个定理做出的卓越贡献使他在天堂中获得了一个珍贵的储存空间高达12.8M的芯片储存器(天堂中稀缺的Si元素都被何老板制造私人跳棋库了,导致天堂中的Si资源极度缺乏)。
正巧,他获得了一个由A~E这五个大写英文字母组成的密码字符矩阵,他想要把它存进芯片储存器中来分析它,但这样芯片剩余的空间就会少得可怜,这可让他操碎了心。
*/
幸好,由ZMY先生改进的万能算法“最小表示法”就在此时因惊动了上帝而从人间传入天堂。于是卜拉美古塔先生对这个算法产生了浓厚的兴趣,并试图将其推广到矩阵之上。

定义一n行m列的字符矩阵C的最小表示法为满足以下条件的r行c列的子矩阵D:
1.满足对于C矩阵的任意元素C[i][j],C[i][j]=D[i%r][j%c](编号从0开始)。
2.是满足条件1的矩阵中r*c最小的。
3.是满足条件2的矩阵中r+c最小的。
4.是满足条件3的矩阵中r最小的。

这样只需记录n,m和最小表示法便可以轻易复原原矩阵,所需的储存空间大大减小。

但现在卜拉美古塔先生突然不想对其推广了,现在他将把这个n*m的字符矩阵给你,请你帮他找出这个矩阵的最小表示法。

输入格式
若干行,每行包括矩阵的一行(保证每行均有m个字符)。

输出格式
第一行,空格间隔的两个整数n,m。
第二行及以后,输出矩阵的最小表示法。

样例输入
ADABADA
ACBBACB

样例输出
2 7
ADAB
ACBB

提示
对于30%的数据,1<=n<=3,1<=m<=15。
对于50%的数据,1<=n<=600,1<=m<=600。
对于100%的数据,1<=n<=3000,1<=m<=3000。

来源 he47

思路:将一整行、一整列看做一个字符,分别对行、列求最小循环节。

#include<cstdio>
#include<iostream>
#include<cstring>
using namespace std;char a[3003][3003];
int n,m;int fail[3003];bool check_m(int x,int y)
{for(int i=0;i<n;i++) if(a[i][x]!=a[i][y]) return false;return true;
}
int kmp_m()
{int j;fail[0]=j=-1;for(int i=1;i<m;i++){while(j>-1&&!check_m(j+1,i)) j=fail[j];if(check_m(j+1,i)) j++;fail[i]=j;}return m-fail[m-1]-1;
}bool check_n(int x,int y)
{for(int i=0;i<m;i++) if(a[x][i]!=a[y][i]) return false;return true;
}
int kmp_n()
{int j;fail[0]=j=-1;for(int i=1;i<n;i++){while(j>-1&&!check_n(j+1,i)) j=fail[j];if(check_n(j+1,i)) j++;fail[i]=j;}return n-fail[n-1]-1;
}int main()
{while(scanf("%s",a[n])!=EOF) n++;m=strlen(a[0]);cout<<n<<" "<<m<<endl;int mm=kmp_m(),nn=kmp_n();for(int i=0,j;i<nn;i++){for(j=0;j<mm;j++) putchar(a[i][j]);putchar(10);}
}

【题】【二维KMP】NKOJ3807 卜拉美古塔与最小表示法相关推荐

  1. 实体类 接口_Java 语言基础编程题 (二维数组, 五子棋游戏, 实体类和接口)

    原文:Java 语言基础编程题 (二维数组, 五子棋游戏, 实体类和接口, 视频讲解) 这里分享三道编程题, 下面是我个人的视频讲解 二维数组, 五子棋游戏, 实体类和接口_哔哩哔哩 (゜-゜)つロ ...

  2. C语言课程训练系统题-二维数组cqupt

    C语言课程训练系统题-二维数组cqupt 1.杨辉三角 2.输出每列最小值 3.一个n位正整数如果等于它的n个数字的n次方和,该数称为n位自方幂数.设计求3~6位自方幂数 4.有如下3*4的矩阵,求出 ...

  3. java二维数组模拟用户登录_Java 语言基础编程题 (二维数组, 五子棋游戏, 实体类和接口)...

    这里分享三道编程题, 下面是我个人的视频讲解我的解题思路以及代码运行演示https://www.zhihu.com/video/1253424180936724480 1. 编程实现以下需求: 定义一 ...

  4. [剑指offer][JAVA]面试题第[04]题[二维数中的查找][数组]

    [问题描述][中等] 在一个 n * m 的二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序.请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整 ...

  5. 九度oj 第1题 二维数组中的查找 何海涛:《剑指Offer:名企面试官精讲典型编程题》

    一.题目信息 题目描述: 在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序.请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数. 输入: ...

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

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

  7. 利用二维码进行市场推广的十大新玩法

    原文:http://www.36kr.com/p/77386.html 本文作者Ekaterina Walter是Intel的社会化媒体专家,也是Intel卓越社交媒体中心(Intel's Socia ...

  8. acwing算法题--二维费用的背包问题

    原题链接:https://www.acwing.com/problem/content/8/ #include <iostream>using namespace std;const in ...

  9. leetcode算法题--二维区域和检索 - 矩阵不可变

    原题链接:https://leetcode-cn.com/problems/range-sum-query-2d-immutable/ 1.暴力(超时) class NumMatrix {public ...

最新文章

  1. joyui版本和android版本,JOYUI 11内测版正式推送,黑鲨游戏手机体验大幅升级
  2. linux的tmp文件夹定期会删除么,关于linux tmp下文件自动删除的问题
  3. Binder fuzz安全研究
  4. VTK:BackgroundImage背景图用法实战
  5. 关于Oracle实时数据库的优化思路
  6. 所谓高情商就是会说话--总结
  7. 用8张图理解Java
  8. 20200314:字母异位词分组(leetcode49)
  9. php.net对称压缩解压缩探讨
  10. Kafka的消费语义
  11. git rm -r --cached_程序员一定能用到的git命令:分支+暂存+回退+标签+创建项目仓库...
  12. php新手自学手册,PHP完全自学手册(文档教程)
  13. python中等高线填充颜色_Matplotlib:使用透明颜色填充等高线图
  14. cpc按点击计算怎么算_亚马逊CR怎么算?亚马逊CR及CTR计算公式介绍
  15. 四、项目计划(华为项目管理法-孙科炎读书摘要)
  16. 视频教程-7步搞定Word样式和模板高效排版-Office/WPS
  17. [转]深度剖析闪电网络
  18. continue和break的区别,以及如何跳出多重循环(或者判断)语句
  19. python子进程kerberos_Python实现Kerberos用户的增删改查操作
  20. css·HTML知识梳理

热门文章

  1. 什么是黑帽SEO。哪些属于黑帽技术?
  2. python求单次测量的标准偏差
  3. 巧用Artisteer快速建站
  4. jQuery 分页器
  5. 自考计算机英语答题技巧,自学考试英语二答题技巧
  6. visio2019科学图形包的使用
  7. 沈向洋博士致2018届毕业生的公开信:计算机科学的三堂人生课
  8. N5010改Windows XP具体方法
  9. 如何查看计算机的磁盘阵列类型,肿么查看RAID类型
  10. 计算机按键闹钟怎么关闭,电子手表怎么关闭闹钟