Death Stars (medium) (Codeforces 958A2)
Tags: Others, hashing

The stardate is 1983, and Princess Heidi is getting better at detecting the Death Stars. This time, two Rebel spies have yet again given Heidi two maps with the possible locations of the Death Star. Since she got rid of all double agents last time, she knows that both maps are correct, and indeed show the map of the solar system that contains the Death Star. However, this time the Empire has hidden the Death Star very well, and Heidi needs to find a place that appears on both maps in order to detect the Death Star.The first map is an N × M grid, each cell of which shows some type of cosmic object that is present in the corresponding quadrant of space. The second map is an M × N grid. Heidi needs to align those two maps in such a way that they overlap over some M × M section in which all cosmic objects are identical. Help Heidi by identifying where such an M × M section lies within both maps.

Input: The first line of the input contains two space-separated integers N and M (1 ≤ N ≤ 2000, 1 ≤ M ≤ 200, M ≤ N). The next N lines each contain M lower-case Latin characters (a-z), denoting the first map. Different characters correspond to different cosmic object types. The next M lines each contain N characters, describing the second map in the same format. 

Output: The only line of the output should contain two space-separated integers i and j, denoting that the section of size M × M in the first map that starts at the i-th row is equal to the section of the second map that starts at the j-th column. Rows and columns are numbered starting from 1.If there are several possible ways to align the maps, Heidi will be satisfied with any of those. It is guaranteed that a solution exists.

Note: The 5-by-5 grid for the first test case looks like this: maytheforcebewithyouhctwo

Sample Inputs:
10 5
somer
andom
noise
mayth
eforc
ebewi
thyou
hctwo
again
noise
somermayth
andomeforc
noiseebewi
againthyou
noisehctwo

Sample Outputs:
4 6

Solution (Python):
(n, m) = list(map(int, input().strip().split(' ')))
(mat1, mat2) = ([], [])
for i in range(0, n):
    mat1.append(tuple(input().strip()))
for i in range(0, m):
    mat2.append(tuple(input().strip()))
(ix, jx, flg) = (-1, -1, 0)
(matr, matc) = ([], [])
for i in range(0, n - m + 1):
    (si, se) = (i, i + m)
    matr.append(hash(tuple(mat1[si:se])))
    matcur2 = []
    for c2i in range(0, m):
        matcur2.append(tuple(mat2[c2i][si:se]))
    matc.append(hash(tuple(matcur2)))
nx = len(matr)
(ix, jx) = (-1, -1)
for ix in range(0, nx):
    flg = 0
    for jx in range(0, nx):
        if matr[ix] == matc[jx]:
            flg = 1
            break
    if flg == 1:
        break
print(str(ix + 1) + ' ' + str(jx + 1))

Solution (Python):
(n, m) = [int(x) for x in input().split()]
list1 = []
list2 = []
for i in range(n):
    list1.append(input())
for j in range(m):
    list2.append(input())
list3 = []
for i in range(n - m + 1):
    y = ''
    for j in range(m):
        y += list1[j + i]
    list3.append(y)
list4 = []
for i in range(n - m + 1):
    y = ''
    for j in range(m):
        y += list2[j][i:i + m]
    list4.append(y)
for i in list3:
    if i in list4:
        print(list3.index(i) + 1, list4.index(i) + 1)
        quit()

Solution (Python):
(n, m) = [int(x) for x in input().split()]
list1 = []
list2 = []
for i in range(n):
    list1.append(input())
for j in range(m):
    list2.append(input())
list3 = []
for i in range(n - m + 1):
    y = ''
    for j in range(m):
        y += list1[j + i]
    list3.append(y)
list4 = []
for i in range(n - m + 1):
    y = ''
    for j in range(m):
        y += list2[j][i:i + m]
    list4.append(y)
for i in list3:
    if i in list4:
        exit(print(list3.index(i) + 1, list4.index(i) + 1))