def is_good_grid():

    for r in range(n):

        for c in range(r):

            if t[r][c] != t[c][r]:

                return False

    return True





n = int(eval(input()))

s = tuple(eval(input()) for _ in range(n))



# (0,0)==(1,1)==...==(n-1,n-1)

# colのオフセットだけ変化させる

# それぞれのループで、n個の状態(0,k)==(1,k+1)==...を扱う



ans = 0

for k in range(n):

    t = [[''] * n for _ in range(n)]

    for r in range(n):

        for c in range(n):

            t[r][c] = s[r][(c + k) % n]

    if is_good_grid():

        ans += n

print(ans)

def is_good_grid(sft):

    for r in range(n):

        r_ = (r - sft) % n  # 減算に直した

        for c in range(r):

            c_ = (c - sft) % n  # 減算に直した

            if s[r][c_] != s[c][r_]:

                # kマス列シフトした後の(r,c)と(c,r)の一致を見るには、

                # (r,c)と(c,r)それぞれの列シフト前、つまり列-sftの座標を見る必要がある

                # r_を用意せず、c_だけで済むと勘違いした

                return False

    return True





n = int(eval(input()))

s = tuple(eval(input()) for _ in range(n))



# (0,0)==(1,1)==...==(n-1,n-1)

# colのオフセットだけ変化させる

# それぞれのループで、n個の状態(0,k)==(1,k+1)==...を扱う



ans = 0

for k in range(n):

    if is_good_grid(k):

        ans += n

print(ans)

def is_good_grid():
    for r in range(n):
        for c in range(r):
            if t[r][c] != t[c][r]:
                return False
    return True


n = int(eval(input()))
s = tuple(eval(input()) for _ in range(n))
# (0,0)==(1,1)==...==(n-1,n-1)
# colのオフセットだけ変化させる
# それぞれのループで、n個の状態(0,k)==(1,k+1)==...を扱う
ans = 0
for k in range(n):
    t = [[""] * n for _ in range(n)]
    for r in range(n):
        for c in range(n):
            t[r][c] = s[r][(c + k) % n]
    if is_good_grid():
        ans += n
print(ans)

def is_good_grid(sft):
    for r in range(n):
        r_ = (r - sft) % n  # 減算に直した
        for c in range(r):
            c_ = (c - sft) % n  # 減算に直した
            if s[r][c_] != s[c][r_]:
                # kマス列シフトした後の(r,c)と(c,r)の一致を見るには、
                # (r,c)と(c,r)それぞれの列シフト前、つまり列-sftの座標を見る必要がある
                # r_を用意せず、c_だけで済むと勘違いした
                return False
    return True


n = int(eval(input()))
s = tuple(eval(input()) for _ in range(n))
# (0,0)==(1,1)==...==(n-1,n-1)
# colのオフセットだけ変化させる
# それぞれのループで、n個の状態(0,k)==(1,k+1)==...を扱う
ans = 0
for k in range(n):
    if is_good_grid(k):
        ans += n
print(ans)

-def is_good_grid(): +def is_good_grid(sft): +        r_ = (r - sft) % n  # 減算に直した -            if t[r][c] != t[c][r]: +            c_ = (c - sft) % n  # 減算に直した +            if s[r][c_] != s[c][r_]: +                # kマス列シフトした後の(r,c)と(c,r)の一致を見るには、 +                # (r,c)と(c,r)それぞれの列シフト前、つまり列-sftの座標を見る必要がある +                # r_を用意せず、c_だけで済むと勘違いした -    t = [[""] * n for _ in range(n)] -    for r in range(n): -        for c in range(n): -            t[r][c] = s[r][(c + k) % n] -    if is_good_grid(): +    if is_good_grid(k):