Submission #1167184

#TimeUsernameProblemLanguageResultExecution timeMemory
1167184InvMODNautilus (BOI19_nautilus)C++20
100 / 100
135 ms636 KiB
#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 timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...