Problem:
Score : 500 points

Problem Statement

Snuke has two boards, each divided into a grid with N rows and N columns.
For both of these boards, the square at the i-th row from the top and the j-th column from the left is called Square (i,j).

There is a lowercase English letter written in each square on the first board. The letter written in Square (i,j) is S_{i,j}. On the second board, nothing is written yet.

Snuke will write letters on the second board, as follows:

First, choose two integers A and B ( 0 \leq A, B < N ).

Write one letter in each square on the second board.
Specifically, write the letter written in Square ( i+A, j+B ) on the first board into Square (i,j) on the second board.
Here, the k-th row is also represented as the (N+k)-th row, and the k-th column is also represented as the (N+k)-th column.

After this operation, the second board is called a good board when, for every i and j ( 1 \leq i, j \leq N ), the letter in Square (i,j) and the letter in Square (j,i) are equal.

Find the number of the ways to choose integers A and B ( 0 \leq A, B < N ) such that the second board is a good board.

Constraints

1 \leq N \leq 300

S_{i,j} ( 1 \leq i, j \leq N ) is a lowercase English letter.

Input

Input is given from Standard Input in the following format:

N
S_{1,1}S_{1,2}..S_{1,N}
S_{2,1}S_{2,2}..S_{2,N}
:
S_{N,1}S_{N,2}..S_{N,N}

Output

Print the number of the ways to choose integers A and B ( 0 \leq A, B < N ) such that the second board is a good board.

Sample Input 1

2
ab
ca

Sample Output 1

2

For each pair of A and B, the second board will look as shown below:

The second board is a good board when (A,B) = (0,1) or (A,B) = (1,0), thus the answer is 2.

Sample Input 2

4
aaaa
aaaa
aaaa
aaaa

Sample Output 2

16

Every possible choice of A and B makes the second board good.

Sample Input 3

5
abcde
fghij
klmno
pqrst
uvwxy

Sample Output 3

0

No possible choice of A and B makes the second board good.

Solution in Python (2.7.6) (judge verdict: Time Limit Exceeded)

import sys
from collections import deque
import copy

def get_read_func(fileobject):
    if fileobject == None :
        return raw_input
    else:
        return fileobject.readline


def main():
    if len(sys.argv) > 1:
        f = open(sys.argv[1])
    else:
        f = None
    read_func = get_read_func(f);
    input_raw = read_func().strip().split()
    [N] = [int(input_raw[0])]
    field = []
    for i in range(N):
        input_raw = read_func().strip()
        field.append(input_raw)

##    judge_ij = []
##    judge_arr = [[0 for i in range(N)] for j in range(N)]
##    center = [0 for i in range(N)]
##
##    for i in range(N):
##        if i == 0 and N > 1:
##            center[i] = 0
##        else:
##            center[i] = (center[i - 1] + (N/2 + 1)) % N
##        for j in range(N):
##            judge_arr[i][j] = field[(i - j) % N][j]

    count = 0
    for k in range(N):
        is_good = True
        for i in range(N):
            for j in range(N):
                if i != j:
                    if field[i][(j + k) % N] != field[j][(i + k) % N]:
                        is_good = False
                        break;
            if is_good == False:
                break
        if is_good == True:
            count += 1
    print count * N




##    good_list = set([])
##    for i in range(N):
##        is_good = True
##        if N %
##        for k in range(1, N):
##            if judge_arr[i][(center[i] + k) % N] != judge_arr[i][(center[i] - k) % N]:
##                is_good== False;
##                break;
##
##
##        for k in range(N):
##            if judge_arr[k][judge_ij[(i + k) % N][0]] != judge_arr[k][judge_ij[(i + k) % N][1]]:
##                is_good = False
##                break;
##        if is_good == True:
##            good_list.add(i)
##    count = 0
##    for A in range(N):
##        for B in range(N):
##            if (A - B) % N in good_list:
##                count += 1
##    print count



if __name__ == '__main__':
    main()