#include <iostream>
#include <cstring>
#include <queue>
using namespace std;
const int MAXN = 105;
int R, C;
char mp[MAXN][MAXN]; //地图
int s[MAXN * MAXN];
int dir[2][6][2] = //搜索方向
{
{{0,-1},{0,1},{-1,0},{1,0},{-1,1},{1,1} }, //偶数行:左 右 左上 左下 右上 右下
{{0,-1},{0,1},{-1,-1},{1,-1},{-1,0},{1,0} } //奇数行:左 右 左上 左下 右上 右下
};
//广搜,flag=true表示消除新球的同色球,flag=false表示消除相连的所有球
int BFS(bool flag, int sr, int sc)
{
memset(s, 0, sizeof(s));
queue<int> q;
q.push(sr * C + sc);
char ch = mp[sr][sc];
mp[sr][sc] = 'E';
int sum = 0;
s[sum++] = sr * C + sc;
while (!q.empty())
{
int pos = q.front();
q.pop();
int r = pos / C, c = pos % C;
for (int i = 0; i < 6; i++)
{
int nr = r + dir[(r + 1) % 2][i][0], nc = c + dir[(r + 1) % 2][i][1];
if (nr < 0 || nr >= R || nc < 0 || nc >= C - nr % 2 || mp[nr][nc] == 'E')
continue;
if (flag && mp[nr][nc] != ch)
continue;
mp[nr][nc] = 'E';
q.push(nr * C + nc);
s[sum++] = nr * C + nc;
}
}
if (flag && sum < 3)
{
for (int i = 0; i < sum; i++)
mp[s[i] / C][s[i] % C] = ch;
}
return sum;
}
int main()
{
int sr, sc;
while (cin >> R >> C >> sr >> sc)
{
memset(mp, 0, sizeof(mp));
--sr; --sc;
for (int i = 0; i < R; i++)
{
cin >> mp[i];
}
int total = 0; //初始总球数
for (int i = 0; i < R; i++)
{
for (int j = 0; mp[i][j]; j++)
{
if (mp[i][j] >= 'a' && mp[i][j] <= 'z')
++total;
}
}
BFS(true, sr, sc);
int ans = 0;
for (int j = 0; j < C; j++)
{
if (mp[0][j] != 'E')
ans += BFS(false, 0, j);
}
cout << total - ans << endl;
}
return 0;
}