矩形
描述
给定两个矩阵,判断第二个矩阵在第一个矩阵的哪些位置出现过。
输入
输入的第一行包含四个正整数a,b,c,d,表示第一个矩阵大小为a×b,第二个矩阵的大小为c×d。
接下来是一个a×b的矩阵。
再接下来是一个c×d的矩阵。
保证矩阵中每个数字都为正整数且不超过100。
输出
若第二个矩阵在第一个矩阵的(i,j)位置出现(即出现位置的左上角),输出i和j。若有多个位置,按字典序从小到大的顺序依次输出。
字典序:对于两个位置(a,b),(c,d),若a<c则(a,b)比(c,d)小,若a>c则(a,b)比(c,d)大,若a=c则再像前边一样比较b和d。
样例1输入
4 4 2 2
1 2 1 2
2 3 2 3
2 1 2 3
2 2 3 1
1 2
2 3
样例1输出
1 1
1 3
3 2
样例1解释
矩阵2在矩阵1的(1,1)、(1,3)、(3,2)这些位置出现了。
样例2
请查看下发文件内的sample2_input.txt和sample2_output.txt。
限制
对于50%的数据,a,b,c,d ≤ 50;
对于100%的数据,a,b,c,d ≤ 1000。
时间:4 sec
空间:512 MB
提示
[对于长度为
L的数列S, S中最大的元素为K,我们设他的hash值H(S)=S1C0+S1C1+...+SLCL−1, 其中C为任意大于
K的常数]
[对于不同的字符串
A,B,
H(A)≠H(B)]
[我们先来看看一维的情况,给定两个字符串
A,B,我们怎么判断A在B中出现?显然我们可以用hash来判断。但是hash值太大了怎么办?取模呀!找一个比较好的质数p,对于字符串A,B,若A=B则显然H(A)modp=H(B)modp;若A≠B,H(A)modp有一定概率会和H(B)modp相同。怎么办呢?我们再找第二个质数p,再来验证H(A)modq和
H(B)modq!可以证明,这样基本上是不会再出错了的。]
[拓展到二维。]
[对于第一个矩阵:]
[我们可以对每一个元素求向左长度为
d的矩阵元素的
hash值,得到一个矩阵。]
[然后我们再用新矩阵,再做一次
hash,就是向上长度为c的矩阵元素的hash值,得到新矩阵
X。]
[接着我们将第二个字符串的
hash值求出来,就是先每一行求一个hash值,再将这c个hash值再hash一次变成一个数字,然后我们就去
X矩阵中找这个数字,找到多少个就说明第二个矩阵在第一个矩阵中出现了多少次。]
[时间复杂度
O(n2)]
另外,为了帮助大家完成题目,我们提供了只包含了输入输出功能的程序模板,也提供了含有算法的大部分实现细节的程序。
你可以根据自己的实际情况,在这些程序的基础上进行作答,或不参考这些程序,这将与你的得分无关。
这些程序可以从【这里】下载。