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 C++14 (GCC 5.4.1) (judge verdict: Accepted)

#include <bits/stdc++.h>
using namespace std;
#define ll long long
#define pb push_back
const int N=305;
const int M=2*N;
const int K=2*M;
const int mod=998244353;
int pow(int x, int k){ int ans=1;for(;k;k>>=1,x=(ll)x*x%mod) if(k&1) ans=(ll)ans*x%mod;return ans;}
int inv(int x){ return pow(x,mod-2);}
char s[M][M];
int diag(int x, int y, int n){ return x-y+n;}
vector<int> Hash[K];
int po[M],ip[M];
void Add(int d, char c)
{
	Hash[d].pb(((ll)Hash[d].back()*26+c-'a'+1)%mod);
}
int Get(int d, int l, int r)
{
	return (Hash[d][r]-(ll)Hash[d][l-1]*po[r-l+1]%mod+mod)%mod;
}
int main()
{
	int n,i,j;
	scanf("%i",&n);
	for(i=1;i<=n;i++) scanf("%s",s[i]+1);
	for(i=1;i<2*n;i++) for(j=1;j<2*n;j++) s[i][j]=s[(i-1)%n+1][(j-1)%n+1];
	po[0]=ip[0]=1;
	for(i=1;i<M;i++) po[i]=(ll)po[i-1]*26%mod;
	ip[1]=inv(26);
	for(i=2;i<M;i++) ip[i]=(ll)ip[i-1]*ip[1]%mod;
	for(i=0;i<K;i++) Hash[i].pb(0);
	for(i=1;i<2*n;i++) for(j=1;j<2*n;j++) Add(diag(i,j,2*n-1),s[i][j]);
	int ans=0;
	for(i=1;i<=n;i++) for(j=1;j<=n;j++)
	{
		bool ok=1;
		for(int k=1;k<n;k++)
		{
			int d1=diag(i,j+k,n*2-1);
			int d2=diag(i+k,j,n*2-1);
			int l=min(i,j+k),r=l+n-k-1;
			int h1=Get(d1,l,r);
			//printf("(l:%i r:%i)\n",l,r);
			l=min(i+k,j);r=l+n-k-1;
			int h2=Get(d2,l,r);
			//printf("(l:%i r:%i)\n",l,r);
			//printf("(i:%i j:%i k:%i) h1:%i h2:%i\n",i,j,k,h1,h2);
			if(h1!=h2){ ok=0;break;}
		}
		ans+=ok;
		//if(ok) printf("%i %i\n",i,j);
	}
	printf("%i\n",ans);
	return 0;
}