给定一个M行N列的01矩阵(只包含数字0或1的矩阵),再执行Q次询问,每次询问给出一个A行B列的01矩阵,求该矩阵是否在原矩阵中出现过。
输入格式
第一行四个整数M,N,A,B。
接下来一个M行N列的01矩阵,数字之间没有空格。
接下来一个整数Q。
接下来Q个A行B列的01矩阵,数字之间没有空格。
输出格式
对于每个询问,输出1表示出现过,0表示没有出现过。
数据范围
A≤100A≤100,M,N,B≤1000,Q≤1000
输入样例:
3 3 2 2
111
000
111
3
11
00
11
11
00
11
输出样例:
1
0
1
题意:给定一个m*n的矩阵,接下来q次询问,每次给出一个a*b的矩阵,判断该a*b的矩阵是否为m*n矩阵的子矩阵。
思路: 因为题意要判断m*n的所有a*b大小的子矩阵中是否有和查询的a*b矩阵相同的矩阵,然而要枚举所有m*n的所有a*b子矩阵的时间复杂度为o(n^2),然后每一个再和查询的a*b矩阵对比的时间复杂度o(n^2),所以这种做法总的时间复杂度为o(n^4),超出了限制时间。所以判断两个子矩阵是否相同时,可以采用hash优化,与处理出来所有a*b子矩阵的hash值,然后直接比较两子矩阵的hash值即可,对比的时间复杂度就降到了o(1),总的时间复杂即可优化为o(n^2);
具体做法:<