题目1 : 大礼堂地毯
时间限制:
10000ms
单点时限:
1000ms
内存限制:
256MB
-
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
描述
小Hi的学校大礼堂的地毯是由很多块N × M大小的基本地毯拼接而成的。例如由2×3的基本地毯
ABC ABD
拼接而成的大礼堂整片地毯如下:
... ABCABCABCABCAB ABDABDABDABDAB . ABCABCABCABCAB . . ABDABDABDABDAB . . ABCABCABCABCAB . ABDABDABDABDAB ABCABCABCABCAB ...
由于大礼堂面积非常大,可以认为整片地毯是由基本地毯无限延伸拼接的。
现在给出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代表它是否可能是大礼堂地毯的一部分。
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<iostream>
#include<cmath>
#include<string>
#include <bits/stdc++.h>
using namespace std;
const int N = 1e4+10;
char str[55][80000], s[1000], str2[110][810];
int main()
{
int n, m, k;
scanf("%d %d %d", &n, &m, &k);
for(int i=0; i<n; i++)
{
scanf("%s",s);
for(int j=1;j<=800;j++) strcat(str[i],s);
}
while(k--)
{
int w, h;
scanf("%d %d", &w, &h);
for(int i=0;i<w;i++)
{
scanf("%s",str2[i]);
}
int k1, k2;
int flag=1;
for(int i=0;i<n;i++)
{
char *p=strstr(str[i],str2[0]);
if(p)
{
k1=p-str[i];
k2=i;
flag=0;
break;
}
}
if(flag)
{
puts("NO");
continue;
}
int x=k2,y=k1;
for(int i=0;i<w;i++)
{
y=k1;
for(int j=0;j<h;j++)
{
if(str2[i][j]!=str[x][y])
{
flag=1;
break;
}
y++;
}
x=(x+1)%n;
if(flag) break;
}
if(flag) puts("NO");
else puts("YES");
}
return 0;
}