#include<stdio.h>
#include<algorithm>
int l, r, u, d;
char A[21][21];
int dx[4] = { 1,-1,0,0 };
int dy[4] = { 0,0,1,-1 };
int acnt[256];
bool is_gone[21][21], ck[256];
bool flag[22][22][22][22];
void dfs_f(int l, int r, int u, int d) {
if (l > r || u > d || flag[l][r][u][d])return;
flag[l][r][u][d] = 1;
dfs_f(l + 1, r, u, d); dfs_f(l, r - 1, u, d);
dfs_f(l, r, u + 1, d); dfs_f(l, r, u, d - 1);
}
struct lrud { int l, r, u, d, S; }Q[22 * 22 * 22 * 22];
bool sort_S(lrud a, lrud b) { return a.S > b.S; }
void dfs(int x, int y) {
is_gone[x][y] = 1;
for (int i = 0; i < 4; i++) {
int nx = x + dx[i];
int ny = y + dy[i];
if (nx < l || r < nx || ny < u || d < ny)continue;
if (A[nx][ny] != A[x][y] || is_gone[nx][ny])continue;
dfs(nx, ny);
}
}
int main() {
int n, i, j, ans = 0, qn = 0;
scanf("%d", &n);
for (i = 0; i < n; i++)scanf("%s", A[i]);
for (l = 0; l < n; l++)for (u = 0; u < n; u++)for (r = n - 1; r >= l; r--)for (d = n - 1; d >= u; d--) {
Q[qn++] = { l,r,u,d,(r - l + 1)*(d - u + 1) };
}
std::sort(Q, Q + qn, sort_S);
for (int q = 0; q < qn; q++) {
l = Q[q].l, r = Q[q].r, u = Q[q].u, d = Q[q].d;
if (flag[l][r][u][d])continue;
int cnt = 0;
char Q[26] = { 0, };
for (i = l; i <= r; i++)for (j = u; j <= d; j++) {
if (!ck[A[i][j]])Q[cnt++] = A[i][j];
ck[A[i][j]] = 1;
if (!is_gone[i][j])dfs(i, j), acnt[A[i][j]]++;
}
if ((cnt == 2 && acnt[Q[0]] == 1 && acnt[Q[1]] >= 2) || (cnt == 2 && acnt[Q[1]] == 1 && acnt[Q[0]] >= 2)) {
ans++;
dfs_f(l, r, u, d);
}
for (i = l; i <= r; i++)for (j = u; j <= d; j++) {
is_gone[i][j] = ck[A[i][j]] = acnt[A[i][j]] = 0;
}
}
printf("%d", ans);
return 0;
}
I2luY2x1ZGU8c3RkaW8uaD4KI2luY2x1ZGU8YWxnb3JpdGhtPgppbnQgbCwgciwgdSwgZDsKY2hhciBBWzIxXVsyMV07CmludCBkeFs0XSA9IHsgMSwtMSwwLDAgfTsKaW50IGR5WzRdID0geyAwLDAsMSwtMSB9OwppbnQgYWNudFsyNTZdOwpib29sIGlzX2dvbmVbMjFdWzIxXSwgY2tbMjU2XTsKYm9vbCBmbGFnWzIyXVsyMl1bMjJdWzIyXTsKdm9pZCBkZnNfZihpbnQgbCwgaW50IHIsIGludCB1LCBpbnQgZCkgewoJaWYgKGwgPiByIHx8IHUgPiBkIHx8IGZsYWdbbF1bcl1bdV1bZF0pcmV0dXJuOwoJZmxhZ1tsXVtyXVt1XVtkXSA9IDE7CglkZnNfZihsICsgMSwgciwgdSwgZCk7IGRmc19mKGwsIHIgLSAxLCB1LCBkKTsKCWRmc19mKGwsIHIsIHUgKyAxLCBkKTsgZGZzX2YobCwgciwgdSwgZCAtIDEpOwp9CnN0cnVjdCBscnVkIHsgaW50IGwsIHIsIHUsIGQsIFM7IH1RWzIyICogMjIgKiAyMiAqIDIyXTsKYm9vbCBzb3J0X1MobHJ1ZCBhLCBscnVkIGIpIHsgcmV0dXJuIGEuUyA+IGIuUzsgfQp2b2lkIGRmcyhpbnQgeCwgaW50IHkpIHsKCWlzX2dvbmVbeF1beV0gPSAxOwoJZm9yIChpbnQgaSA9IDA7IGkgPCA0OyBpKyspIHsKCQlpbnQgbnggPSB4ICsgZHhbaV07CgkJaW50IG55ID0geSArIGR5W2ldOwoJCWlmIChueCA8IGwgfHwgciA8IG54IHx8IG55IDwgdSB8fCBkIDwgbnkpY29udGludWU7CgkJaWYgKEFbbnhdW255XSAhPSBBW3hdW3ldIHx8IGlzX2dvbmVbbnhdW255XSljb250aW51ZTsKCQlkZnMobngsIG55KTsKCX0KfQppbnQgbWFpbigpIHsKCWludCBuLCBpLCBqLCBhbnMgPSAwLCBxbiA9IDA7CglzY2FuZigiJWQiLCAmbik7Cglmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKXNjYW5mKCIlcyIsIEFbaV0pOwoJZm9yIChsID0gMDsgbCA8IG47IGwrKylmb3IgKHUgPSAwOyB1IDwgbjsgdSsrKWZvciAociA9IG4gLSAxOyByID49IGw7IHItLSlmb3IgKGQgPSBuIC0gMTsgZCA+PSB1OyBkLS0pIHsKCQlRW3FuKytdID0geyBsLHIsdSxkLChyIC0gbCArIDEpKihkIC0gdSArIDEpIH07Cgl9CglzdGQ6OnNvcnQoUSwgUSArIHFuLCBzb3J0X1MpOwoJZm9yIChpbnQgcSA9IDA7IHEgPCBxbjsgcSsrKSB7CgkJbCA9IFFbcV0ubCwgciA9IFFbcV0uciwgdSA9IFFbcV0udSwgZCA9IFFbcV0uZDsKCQlpZiAoZmxhZ1tsXVtyXVt1XVtkXSljb250aW51ZTsKCQlpbnQgY250ID0gMDsKCQljaGFyIFFbMjZdID0geyAwLCB9OwoJCWZvciAoaSA9IGw7IGkgPD0gcjsgaSsrKWZvciAoaiA9IHU7IGogPD0gZDsgaisrKSB7CgkJCWlmICghY2tbQVtpXVtqXV0pUVtjbnQrK10gPSBBW2ldW2pdOwoJCQlja1tBW2ldW2pdXSA9IDE7CgkJCWlmICghaXNfZ29uZVtpXVtqXSlkZnMoaSwgaiksIGFjbnRbQVtpXVtqXV0rKzsKCQl9CgkJaWYgKChjbnQgPT0gMiAmJiBhY250W1FbMF1dID09IDEgJiYgYWNudFtRWzFdXSA+PSAyKSB8fCAoY250ID09IDIgJiYgYWNudFtRWzFdXSA9PSAxICYmIGFjbnRbUVswXV0gPj0gMikpIHsKCQkJYW5zKys7CgkJCWRmc19mKGwsIHIsIHUsIGQpOwoJCX0KCQlmb3IgKGkgPSBsOyBpIDw9IHI7IGkrKylmb3IgKGogPSB1OyBqIDw9IGQ7IGorKykgewoJCQlpc19nb25lW2ldW2pdID0gY2tbQVtpXVtqXV0gPSBhY250W0FbaV1bal1dID0gMDsKCQl9Cgl9CglwcmludGYoIiVkIiwgYW5zKTsKCXJldHVybiAwOwp9