Submission #146446

#TimeUsernameProblemLanguageResultExecution timeMemory
146446meatrowNautilus (BOI19_nautilus)C++17
100 / 100
283 ms876 KiB
//#pragma GCC optimize("O3")
//#pragma GCC target("sse,sse2,sse3,ssse3,sse4,popcnt,abm,mmx,tune=native")
//#pragma GCC optimize ("unroll-loops")
#include <bits/stdc++.h>
 
using namespace std;
 
using ll = long long;
using ld = long double;

const int N = 500;

bitset<N> dp[2][N];
bitset<N> water[N];
int r, c;

void hor_shift(int u, int s) {
    if (s > 0) {
        for (int i = 0; i < r; i++) {
            dp[u][i] |= dp[u ^ 1][i] >> 1;
        }
    } else {
        for (int i = 0; i < r; i++) {
            dp[u][i] |= dp[u ^ 1][i] << 1;
        }
    }
}

void ver_shift(int u, int s) {
    for (int i = 0; i < r; i++) {
        if (i + s >= 0 && i + s < r) {
            dp[u][i] |= dp[u ^ 1][i + s];
        }
    }
}

int main() {
    ios::sync_with_stdio(false);
    cin.tie(nullptr);
    cout.tie(nullptr);
    int m;
    cin >> r >> c >> m;
    for (int i = 0; i < r; i++) {
        for (int j = 0; j < c; j++) {
            char a;
            cin >> a;
            if (a == '.') {
                water[i].set(j);
                dp[0][i][j] = 1;
            }
        }    
    }
    string t;
    cin >> t;
    int v = 0;
    for (char c : t) {
        int u = v ^ 1;
        for (int i = 0; i < r; i++) {
            dp[u][i].reset();
        }
        if (c == 'N') {
            ver_shift(u, 1);
        }
        if (c == 'S') {
            ver_shift(u, -1);
        }
        if (c == 'E') {
            hor_shift(u, -1);
        }
        if (c == 'W') {
            hor_shift(u, 1);
        }
        if (c == '?') {
            ver_shift(u, 1);
            ver_shift(u, -1);
            hor_shift(u, 1);
            hor_shift(u, -1);
        }
        for (int i = 0; i < r; i++) {
            dp[u][i] &= water[i];
        }
        v ^= 1;
    }
    int ans = 0;
    for (int i = 0; i < r; i++) {
        ans += dp[m & 1][i].count();
    }
    cout << ans;
    return 0;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...