제출 #1341794

#제출 시각아이디문제언어결과실행 시간메모리
1341794iamhereforfunNautilus (BOI19_nautilus)C++20
100 / 100
197 ms624 KiB
// Starcraft 2 enjoyer //

#include <bits/stdc++.h>

// #pragma GCC target("avx2")
// #pragma GCC optimize("O3")
// #pragma GCC optimize("unroll-loops")

using namespace std;

#define LSOne(X) ((X) & -(X))

const int N = 5e2 + 5;
const int K = 1e2 + 5;
const int M = 2e5 + 5;
const int LG = 20;
const long long INF = 1e18 + 5;
const int C = 26;
const int B = 1000;
const int MOD = 998244353;

int n, m, q, cnt;
bitset<N> col[N], row[N], mprow[N], mpcol[N], col1[N], row1[N];

inline void solve()
{
    cin >> n >> m >> q;
    for (int x = 1; x <= n; x++)
    {
        for (int y = 1; y <= m; y++)
        {
            char c;
            cin >> c;
            if (c == '#')
            {
                col[y].set(x, 0);
                mpcol[y].set(x, 0);
                row[x].set(y, 0);
                mprow[x].set(y, 0);
            }
            else
            {
                col[y].set(x, 1);
                mpcol[y].set(x, 1);
                row[x].set(y, 1);
                mprow[x].set(y, 1);
            }
        }
    }
    for (int x = 0; x < q; x++)
    {
        char c;
        cin >> c;
        if (c == 'W') // <
        {
            for (int y = 2; y <= m; y++)
            {
                col[y - 1] = col[y] & mpcol[y - 1];
            }
            for (int x = 1; x <= n; x++)
            {
                row[x] = mprow[x] & (row[x] >> 1); // reverse
            }
            for (int x = 1; x <= n; x++)
            {
                col[m].reset(x);
                row[x].reset(m);
            }
        }
        if (c == 'N') // ^
        {
            for (int x = 2; x <= n; x++)
            {
                row[x - 1] = row[x] & mprow[x - 1];
            }
            for (int y = 1; y <= m; y++)
            {
                col[y] = mpcol[y] & (col[y] >> 1); // reverse
            }
            for (int y = 1; y <= m; y++)
            {
                row[n].reset(y);
                col[y].reset(n);
            }
        }
        if (c == 'E') // >
        {
            for (int y = m - 1; y >= 1; y--)
            {
                col[y + 1] = col[y] & mpcol[y + 1];
            }
            for (int x = 1; x <= n; x++)
            {
                row[x] = mprow[x] & (row[x] << 1); // reverse
            }
            for (int x = 1; x <= n; x++)
            {
                row[x].reset(1);
                col[1].reset(x);
            }
        }
        if (c == 'S') // v
        {
            for (int x = n - 1; x >= 1; x--)
            {
                row[x + 1] = row[x] & mprow[x + 1];
            }
            for (int y = 1; y <= m; y++)
            {
                col[y] = mpcol[y] & (col[y] << 1); // reverse
            }
            for (int y = 1; y <= m; y++)
            {
                col[y].reset(1);
                row[1].reset(y);
            }
        }
        if (c == '?') // all
        {
            for (int x = 1; x <= n; x++)
            {
                row1[x] = (row[x - 1] | row[x + 1] | (row[x] >> 1) | (row[x] << 1)) & mprow[x];
            }
            for (int y = 1; y <= m; y++)
            {
                col1[y] = (col[y - 1] | col[y + 1] | (col[y] >> 1) | (col[y] << 1)) & mpcol[y];
            }
            for (int x = 1; x <= n; x++)
            {
                swap(row[x], row1[x]);
            }
            for (int y = 1; y <= m; y++)
            {
                swap(col[y], col1[y]);
            }
        }
        // cout << c << "\n";
        // for (int x = 1; x <= n; x++)
        // {
        //     for (int y = 1; y <= m; y++)
        //     {
        //         if (row[x][y] != col[y][x])
        //         {
        //             cout << x << " " << y << "BRUH\n";
        //         }
        //     }
        // }
        // cout << "\n";
        // for (int x = 1; x <= n; x++)
        // {
        //     for (int y = 1; y <= m; y++)
        //     {
        //         cout << row[x][y];
        //     }
        //     cout << "\n";
        // }
        // cout << "\n";
        // for (int x = 1; x <= n; x++)
        // {
        //     for (int y = 1; y <= m; y++)
        //     {
        //         cout << col[y][x];
        //     }
        //     cout << "\n";
        // }
        // cout << "\n";
    }
    for (int x = 1; x <= n; x++)
    {
        for (int y = 1; y <= m; y++)
        {
            cnt += row[x][y];
        }
    }
    cout << cnt;
}

signed main()
{
    ios_base::sync_with_stdio(0);
    cin.tie(0);
    cout.tie(0);
    int t = 1;
    // cin >> t;
    for (int x = 1; x <= t; x++)
    {
        solve();
    }
    return 0;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...