#include<bits/stdc++.h>
using namespace std;
#define sz(v) (int)(v).size()
const int N = 505;
int32_t main(){
ios_base::sync_with_stdio(0);
cin.tie(0); cout.tie(0);
int r,c,m; cin >> r >> c >> m;
vector<bitset<N>> a(r, bitset<N>());
for(int i = 0; i < r; i++){
for(int j = 0; j < c; j++){
char x; cin >> x;
a[i][j] = (x != '#');
}
}
vector<vector<bitset<N>>> dp(2, vector<bitset<N>>(r, bitset<N>()));
for(int i = 0; i < r; i++){
for(int j = 0; j < c; j++){
dp[0][i][j] = a[i][j];
}
}
string s; cin >> s;
bitset<N> base(0);
auto modify_north = [&]() -> void{
// i -> i - 1
dp[1][r - 1] = dp[1][r - 1] & base;
for(int i = r - 2; i >= 0; i--){
dp[1][i] = dp[0][i + 1] & a[i];
}
swap(dp[0], dp[1]);
};
auto modify_south = [&]() -> void{
// i -> i + 1
dp[1][0] = dp[1][0] & base;
for(int i = 1; i < r; i++){
dp[1][i] = dp[0][i - 1] & a[i];
}
swap(dp[0], dp[1]);
};
auto modify_east = [&]() -> void{
// j -> j + 1
for(int i = 0; i < r; i++){
dp[1][i] = (dp[0][i] << 1) & a[i];
}
swap(dp[0], dp[1]);
};
auto modify_west = [&]() -> void{
// j -> j - 1
for(int i = 0; i < r; i++){
dp[1][i] = (dp[0][i] >> 1) & a[i];
}
swap(dp[0], dp[1]);
};
auto random_modify = [&]() -> void{
for(int i = 0; i < r; i++) dp[1][i] = dp[1][i] & base;
for(int i = 0; i < r; i++){
dp[1][i] = dp[1][i] | ((dp[0][i] << 1) & a[i]);
dp[1][i] = dp[1][i] | ((dp[0][i] >> 1) & a[i]);
if(i > 0) dp[1][i] = dp[1][i] | (dp[0][i - 1] & a[i]);
if(i < r - 1) dp[1][i] = dp[1][i] | (dp[0][i + 1] & a[i]);
}
swap(dp[0], dp[1]);
};
for(char& x : s){
if(x == 'N') modify_north();
if(x == 'S') modify_south();
if(x == 'W') modify_west();
if(x == 'E') modify_east();
if(x == '?') random_modify();
}
int answer = 0;
for(int i = 0; i < r; i++)
answer = answer + dp[0][i].count();
cout << answer << "\n";
return 0;
}
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |