// Starcraft 2 enjoyer //
#include <bits/stdc++.h>
// #pragma GCC target("avx2")
// #pragma GCC optimize("O3")
// #pragma GCC optimize("unroll-loops")
using namespace std;
#define LSOne(X) ((X) & -(X))
const int N = 5e2 + 5;
const int K = 1e2 + 5;
const int M = 2e5 + 5;
const int LG = 20;
const long long INF = 1e18 + 5;
const int C = 26;
const int B = 1000;
const int MOD = 998244353;
int n, m, q, cnt;
bitset<N> col[N], row[N], mprow[N], mpcol[N], col1[N], row1[N];
inline void solve()
{
cin >> n >> m >> q;
for (int x = 1; x <= n; x++)
{
for (int y = 1; y <= m; y++)
{
char c;
cin >> c;
if (c == '#')
{
col[y].set(x, 0);
mpcol[y].set(x, 0);
row[x].set(y, 0);
mprow[x].set(y, 0);
}
else
{
col[y].set(x, 1);
mpcol[y].set(x, 1);
row[x].set(y, 1);
mprow[x].set(y, 1);
}
}
}
for (int x = 0; x < q; x++)
{
char c;
cin >> c;
if (c == 'W') // <
{
for (int y = 2; y <= m; y++)
{
col[y - 1] = col[y] & mpcol[y - 1];
}
for (int x = 1; x <= n; x++)
{
row[x] = mprow[x] & (row[x] >> 1); // reverse
}
col[m].reset();
for (int x = 1; x <= n; x++)
{
row[x].reset(m);
}
}
if (c == 'N') // ^
{
for (int x = 2; x <= n; x++)
{
row[x - 1] = row[x] & mprow[x - 1];
}
for (int y = 1; y <= m; y++)
{
col[y] = mpcol[y] & (col[y] >> 1); // reverse
}
row[n].reset();
for (int y = 1; y <= m; x++)
{
col[y].reset(n);
}
}
if (c == 'E') // >
{
for (int y = m - 1; y >= 1; y--)
{
col[y + 1] = col[y] & mpcol[y + 1];
}
for (int x = 1; x <= n; x++)
{
row[x] = mprow[x] & (row[x] << 1); // reverse
}
col[1].reset();
for (int x = 1; x <= n; x++)
{
row[x].reset(1);
}
}
if (c == 'S') // v
{
for (int x = n - 1; x >= 1; x--)
{
row[x + 1] = row[x] & mprow[x + 1];
}
for (int y = 1; y <= m; y++)
{
col[y] = mpcol[y] & (col[y] << 1); // reverse
}
row[1].reset();
for (int y = 1; y <= m; y++)
{
col[y].reset(1);
}
}
if (c == '?') // all
{
for (int x = 1; x <= n; x++)
{
row1[x] = (row[x - 1] | row[x + 1] | (row[x] >> 1) | (row[x] << 1)) & mprow[x];
}
for (int y = 1; y <= m; y++)
{
col1[y] = (col[y - 1] | col[y + 1] | (col[y] >> 1) | (col[y] << 1)) & mpcol[y];
}
for (int x = 1; x <= n; x++)
{
swap(row[x], row1[x]);
}
for (int y = 1; y <= m; y++)
{
swap(col[y], col1[y]);
}
}
// cout << c << "\n";
// for (int x = 1; x <= n; x++)
// {
// for (int y = 1; y <= m; y++)
// {
// if (row[x][y] != col[y][x])
// {
// cout << x << " " << y << "BRUH\n";
// }
// }
// }
// cout << "\n";
// for (int x = 1; x <= n; x++)
// {
// for (int y = 1; y <= m; y++)
// {
// cout << row[x][y];
// }
// cout << "\n";
// }
// cout << "\n";
// for (int x = 1; x <= n; x++)
// {
// for (int y = 1; y <= m; y++)
// {
// cout << col[y][x];
// }
// cout << "\n";
// }
// cout << "\n";
}
for (int x = 1; x <= n; x++)
{
for (int y = 1; y <= m; y++)
{
cnt += row[x][y];
}
}
cout << cnt;
}
signed main()
{
ios_base::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
int t = 1;
// cin >> t;
for (int x = 1; x <= t; x++)
{
solve();
}
return 0;
}