描述

小Hi的学校大礼堂的地毯是由很多块N × M大小的基本地毯拼接而成的。例如由2×3的基本地毯

ABC
ABD

拼接而成的大礼堂整片地毯如下:

       ...       ABCABCABCABCABABDABDABDABDAB
. ABCABCABCABCAB .
. ABDABDABDABDAB .
. ABCABCABCABCAB .ABDABDABDABDABABCABCABCABCAB...

由于大礼堂面积非常大,可以认为整片地毯是由基本地毯无限延伸拼接的。

现在给出K张地毯的照片,请你判断哪些照片可能是小Hi学校大礼堂地毯的一部分。不需要考虑旋转照片的方向。

例如

BCA
BDA
BCA

可能是上述地毯的一部分,但

BAC
BAD

不可能是上述地毯的一部分。

输入

第1行包含三个整数,N,M 和 K。

第2~N+1行包含一个N × M的矩阵,代表基本地毯的样式。其中每一个元素都是一个大写字母(A-Z)。

之后是 K 张照片的数据。

每张照片的第一行包含两个整数,H 和 W,代表照片的大小。

以下 H 行包含一个 H × W的矩阵,代表照片中地毯的样式。其中每一个元素都是一个大写字母(A-Z)。

对于80%的数据,1 ≤ N, M ≤ 10, 1 ≤ H, W ≤ 100

对于100%的数据, 1 ≤ N, M ≤ 50, 1 ≤ K ≤ 10, 1 ≤ H ≤ 100, 1 ≤ W ≤ 800。

输出

对于每张照片,输出YES或者NO代表它是否可能是大礼堂地毯的一部分。

样例输入

2 3 3
ABC
ABD
3 3
BCA
BDA
BCA
2 3
BAC
BAD
7 14
ABCABCABCABCAB
ABDABDABDABDAB
ABCABCABCABCAB
ABDABDABDABDAB
ABCABCABCABCAB
ABDABDABDABDAB
ABCABCABCABCAB

样例输出

YES
NO
YES

解析:

我们假设NxM的基本地毯叫A,HxW的照片叫B。A和B都可以看作是一个二维矩阵。

B是大礼堂地毯的一部分,当且仅当能找到x和y满足:

B[i][j] = A[(i + x) mod N][(j + y) mod M] 且 0 <= x < N, 0 <= y < M。

直观来说就是找到B[0][0]对应的格子A[x][y],并且B的任意一个格子都与A循环拼接之后对应的格子相同。

于是我们很容易得到一个基本的思路:

(1) 首先枚举B[0][0]对应的格子A[x][y],复杂度是O(NM)。

(2) 然后判断每一个格子B[i][j]是不是与A循环拼接之后对应的格子A[(i + x) mod N][(j + y) mod M]相同,复杂度是O(HW)。

这个每个判断的总时间复杂度是O(NMHW),有可能会超时。

优化的方法是,预先判断B是不是一个由某个NxM的基本地毯循环拼接得到的。

如果B是由A循环拼接得到的,那么B必然满足B[i][j] = B[i+N][j]B[i][j] = B[i][j+M]。判断这一点的时间复杂度是O(HW)。

如果这一点不成立,那么答案就是NO。否则我们知道B是一个在横向上mod N循环,在纵向上mod M循环的二维矩阵。

那么就可以简化之前(2)的判断范围。我们不用判断B中的每个格子,而只要判断min(N, H) x min(M, W)这个范围内的格子即可。时间复杂度是O(NM)。

所以判断一张照片的总时间复杂度是O(N^2M^2 + HW)。

#include <bits/stdc++.h>
using namespace std;
#define fi first
#define se second
#define ff(i,a,b) for(int i = a; i <= b; i++)
#define f(i,a,b) for(int i = a; i < b; i++)
typedef pair<int,int> P;
#define ll long long
char s[110][110];
char s1[110][810];
int main()
{int n, m, k;cin >> n >> m >> k;f(i,0,n) f(j,0,m)scanf(" %c", &s[i][j]);f(i,0,n) f(j,0,m) s[i+n][j] = s[i][j+m] = s[i+n][j+m] = s[i][j];while(k--){int nn, mm;scanf("%d %d", &nn, &mm);f(i,0,nn) f(j,0,mm)scanf(" %c", &s1[i][j]);int flag = 1;f(i,0,nn) f(j,0,mm)if(s1[i%n][j] != s1[i][j] || s1[i][j%m] != s1[i][j]) { flag = 0;}int minr = min(n,nn),minc = min(m,mm);int flag2 = 0;f(i,0,n){f(j,0,m){flag2 = 1;f(h,0,minr) f(g,0,minc)if(s[i+h][j+g] != s1[h][g]) flag2 = 0;if(flag2) break;}if(flag2) break;}if(flag2 && flag) printf("YES\n");else puts("NO");}
}

hihocoder 1538相关推荐

  1. hihoCoder#1538 大礼堂地毯 (模拟)

    #1538 : 大礼堂地毯 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 小Hi的学校大礼堂的地毯是由很多块N × M大小的基本地毯拼接而成的.例如由2×3的基本地毯 ...

  2. hihoCoder 网络流四·最小路径覆盖

    题面带解释 hihoCoder感觉很好. 网络流的精华就是建图 #include<cstdio> #include<iostream> #include<algorith ...

  3. hihoCoder #1142 : 三分求极值

    #1142 : 三分·三分求极值 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 这一次我们就简单一点了,题目在此: 在直角坐标系中有一条抛物线y=ax^2+bx+c和一 ...

  4. hihocoder 后缀自动机专题

    一.后缀自动机基本概念的理解 1.首先后缀自动机的状态是由子串的endpos来决定的 子串的endpos是指一个子串可以在原字符串的哪些位置进行匹配, endpos构成的不同集合划分成不同的状态 关于 ...

  5. hihoCoder 1051 补提交卡(贪心,枚举)

    #1051 : 补提交卡 时间限制:2000ms 单点时限:1000ms 内存限制:256MB 描述 小Ho给自己定了一个宏伟的目标:连续100天每天坚持在hihoCoder上提交一个程序.100天过 ...

  6. hihoCoder week3 KMP算法

    题目链接 https://hihocoder.com/contest/hiho3/problems kmp算法 #include <bits/stdc++.h> using namespa ...

  7. hihoCoder 第136周 优化延迟(二分答案+手写堆)

    题目1 : 优化延迟 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 小Ho编写了一个处理数据包的程序.程序的输入是一个包含N个数据包的序列.每个数据包根据其重要程度不同 ...

  8. hihoCoder 1578 Visiting Peking University 【贪心】 (ACM-ICPC国际大学生程序设计竞赛北京赛区(2017)网络赛)...

    #1578 : Visiting Peking University 时间限制:1000ms 单点时限:1000ms 内存限制:256MB 描述 Ming is going to travel for ...

  9. hihoCoder太阁最新面经算法竞赛18

    比赛链接:http://hihocoder.com/contest/hihointerview27/problems A.Big Plus 模拟水 1 #include <bits/stdc++ ...

  10. hihocoder 1061.Beautiful String

    题目链接:http://hihocoder.com/problemset/problem/1061 题目意思:给出一个不超过10MB长度的字符串,判断是否里面含有一个beautiful strings ...

最新文章

  1. iOS arm 64 的了解
  2. InfluxDb中写入重复数据问题解决方案
  3. docker 部署redis
  4. OpenCv2 学习笔记(1) Mat创建、复制、释放
  5. 对于数据库表排他更新的理解
  6. 计算一个时间,是否在规定的时期时间之间
  7. listview 样式 LVS_REPORT 与 LVS_EDITLABELS 编辑单元格时,当前行第一列内容不显示
  8. Binutils工具集中的一些比较常用的工具
  9. android苹果耳机音量调节,安卓线控耳机怎么调节音量大小?
  10. 神经网络数据分析案例题,神经网络模型数据处理
  11. java上传图片裁剪_上传图像之裁剪
  12. c语言 指针混合编程,entern “C”/(C/C++)混合编程(转)
  13. c语言一个整数犯二的程度编程,2016天梯初赛上篇(部分题目)
  14. 青春时代——是路过还是错过
  15. 【Games101】图形的基础变换 总结
  16. 追们算法----奶牛和草丛
  17. Java基础知识与集合部分面试题整理
  18. ZYNQ学习之旅--PS_AXI_VDMA(利用VDMA实现将PS端的数据显示在PL端的HDMI上)
  19. 微信开发者工具中的版本管理功能搭配gitee使用
  20. Linux下useradd与adduser的区别

热门文章

  1. 六足机器人步态与动力学仿真
  2. 计算机网络课程设计组建大型网吧局域网,计算机网络课程设计报告—组建大型网吧局域网.doc...
  3. Linux那些让你虎躯一震的命令
  4. IDEA中修改html页面后在浏览器不生效的解决方法
  5. ESLint 格式化程序
  6. Mock.js + RAP 使用介绍
  7. 工作小结_2016年2月23日23:16:59
  8. 戏法人人会做, 巧妙各有不同。 你文不会之乎者也, 武不能安国定邦。 只会些鸡鸣狗盗, 雕虫小伎。 智者顺时而谋, 愚者逆理而动。 我接受你的挑战!
  9. 51cto python数据分析系列课程 55g_Python 3 数据分析与挖掘系列课程完整版
  10. android拦截所有短信源码,Android手机防短信电话骚扰宝典 手机也会思考