제출 #1165244

#제출 시각아이디문제언어결과실행 시간메모리
1165244fryingducNautilus (BOI19_nautilus)C++20
100 / 100
135 ms760 KiB
#include "bits/stdc++.h"

using namespace std;

#ifdef duc_debug
#include "bits/debug.h"
#else
#define debug(...)
#endif

const int maxn = 505;
const int M = 5005;
int n, m, t;
char a[maxn][maxn];
string s;
bitset<maxn> bs[maxn];
bitset<maxn> block[maxn];

void solve() {
  cin >> n >> m >> t;
  for (int i = 1; i <= n; ++i) {
    for (int j = 1; j <= m; ++j) {
      cin >> a[i][j];
    }
  }
  cin >> s;
  for (int i = 1; i <= n; ++i) {
    for (int j = 1; j <= m; ++j) {
      if (a[i][j] != '#') bs[i].set(j);
    }
    block[i] = bs[i];
  }
  for (auto c : s) {
    if (c == 'N') {
      for (int i = 1; i <= n; ++i) {
        bs[i] = bs[i + 1] & block[i];
      }
    } else if (c == 'S') {
      for (int i = n; i; --i) {
        bs[i] = bs[i - 1] & block[i];
      }
    } else if (c == 'E') {
      for (int i = 1; i <= n; ++i) {
        bs[i] = (bs[i] << 1) & block[i];
      }
    } else if (c == 'W') {
      for (int i = 1; i <= n; ++i) {
        bs[i] = (bs[i] >> 1) & block[i];
      }
    } else {
      bitset<maxn> prv, cur;
      for (int i = 1; i <= n; ++i) {
        cur = bs[i];
        bs[i] = (prv & block[i]) | (bs[i + 1] & block[i]) | ((bs[i] >> 1) & block[i]) | ((bs[i] << 1) & block[i]);
        prv = cur;
      }
    }
  }
  int res = 0;
  for (int i = 1; i <= n; ++i) {
    for (int j = 1; j <= m; ++j) {
//      cout << bs[i][j];
      if (bs[i][j]) ++res;
    }
//    cout << '\n';
  }
  cout << res;
}

signed main() {
  ios_base::sync_with_stdio(0);
  cin.tie(0);

  solve();

  return 0;
}


#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...