제출 #757780

#제출 시각아이디문제언어결과실행 시간메모리
757780taherNautilus (BOI19_nautilus)C++17
100 / 100
493 ms2240 KiB
#include <bits/stdc++.h>

using namespace std;

const int Maxn = 500 + 1;

int main() {
  ios::sync_with_stdio(false);
  cin.tie(0);
  int r , c , m;
  cin >> r >> c >> m;
  vector<vector<char>> g(r , vector<char> (c));
  for (int i = 0 ; i < r ; i++) {
    for (int j = 0 ; j < c ; j++) {
      cin >> g[i][j];
    }
  }
  string s;
  cin >> s;
  vector<bitset<Maxn>> cur(r) , forbidden(r);
  bitset<Maxn> Fixer;
  for (int i = 0 ; i < c ; i++) {
    Fixer[i] = 1;
  }
  auto Move_Up = [&]() {
    vector<bitset<Maxn>> res(r);
    for (int i = 0 ; i < r - 1 ; i++) {
      res[i] |= cur[i + 1];
    }
    vector<bitset<Maxn>> t = res;
    for (int i = 0 ; i < r ; i++) {
      t[i] ^= forbidden[i];      
    }
    for (int i = 0 ; i < r ; i++) {
      res[i] &= t[i];
    }
    return res;
  };

  auto Move_Down = [&]() {
    vector<bitset<Maxn>> res(r);
    for (int i = 1 ; i < r ; i++) {
      res[i] |= cur[i - 1];
    }
    vector<bitset<Maxn>> t = res;
    for (int i = 0 ; i < r ; i++) {
      t[i] ^= forbidden[i];      
    }
    for (int i = 0 ; i < r ; i++) {
      res[i] &= t[i];
    }
    return res;
  };

  auto Move_Left = [&]() {
    vector<bitset<Maxn>> res(r);
    for (int i = 0 ; i < r ; i++) {
      res[i] = (cur[i] >> 1);
    }
    vector<bitset<Maxn>> t = res;
    for (int i = 0 ; i < r ; i++) {
      t[i] ^= forbidden[i];      
    }
    for (int i = 0 ; i < r ; i++) {
      res[i] &= t[i];
    }
    return res;
  };

  auto Move_Right = [&]() {
    vector<bitset<Maxn>> res(r);
    for (int i = 0 ; i < r ; i++) {
      res[i] = (cur[i] << 1);
    }
    vector<bitset<Maxn>> t = res;
    for (int i = 0 ; i < r ; i++) {
      t[i] ^= forbidden[i];      
    }
    for (int i = 0 ; i < r ; i++) {
      res[i] &= t[i];
    }
    return res;    
  };

  auto Fix = [&]() {
    for (int i = 0 ; i < r ; i++) {
      cur[i] &= Fixer;
    }
    return ;
  };

  for (int i = 0 ; i < r ; i++) {
    for (int j = 0 ; j < c ; j++) {
      if (g[i][j] != '#') cur[i][j] = true;
      else forbidden[i][j] = true;
    }
  }
  for (int idx = 0 ; idx < m ; idx++) {
    vector<bitset<Maxn>> res(r);
    if (s[idx] == 'N') {
      res = Move_Up();      
    }
    else if (s[idx] == 'S') {
      res = Move_Down();
    }
    else if (s[idx] == 'E') {
      res = Move_Right();
    }
    else if (s[idx] == 'W') {
      res = Move_Left();
    }
    else {
      vector<bitset<Maxn>> A = Move_Down();
      vector<bitset<Maxn>> B = Move_Left();
      vector<bitset<Maxn>> C = Move_Right();
      vector<bitset<Maxn>> D = Move_Up();
      for (int i = 0 ; i < r ; i++) {
        res[i] |= A[i];
        res[i] |= B[i];
        res[i] |= C[i];
        res[i] |= D[i];
      }
    } 
    swap(cur , res);
    Fix();
  }
  int ans = 0;
  for (int i = 0 ; i < r ; i++) {
    for (int j = 0 ; j < c ; j++) {
      if (cur[i][j]) {
        assert(g[i][j] != '#');
        ans += 1;
      }
    }
  }
  cout << ans << '\n';
  return 0; 
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...