第四周-1.1矩形

                                 矩形


描述

给定两个矩阵,判断第二个矩阵在第一个矩阵的哪些位置出现过。

输入

输入的第一行包含四个正整数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)]

另外,为了帮助大家完成题目,我们提供了只包含了输入输出功能的程序模板,也提供了含有算法的大部分实现细节的程序。

你可以根据自己的实际情况,在这些程序的基础上进行作答,或不参考这些程序,这将与你的得分无关。

这些程序可以从【这里】下载。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值