Submission #1099587

#TimeUsernameProblemLanguageResultExecution timeMemory
1099587andrei_iorgulescuNautilus (BOI19_nautilus)C++14
100 / 100
267 ms154208 KiB
#include <bits/stdc++.h>

using namespace std;

int n, m, k;
char a[505][505];
char s[5005];
bitset<250005> dp[5005];
bitset<250005> f_up, f_down, f_left, f_right;

int main()
{
    ios_base::sync_with_stdio(false);
    cin.tie(NULL);
    cout.tie(NULL);
    cin >> n >> m >> k;
    for (int i = 1; i <= n; i++)
        for (int j = 1; j <= m; j++)
            cin >> a[i][j];
    for (int i = 1; i <= k; i++)
        cin >> s[i];
    for (int i = 1; i <= n; i++)
        for (int j = 1; j <= m; j++)
            if (a[i][j] == '.')
                dp[0][(i - 1) * m + j] = 1;
    for (int i = 1; i <= n; i++)
    {
        for (int j = 1; j <= m; j++)
        {
            if (a[i][j] == '.')
            {
                if (i - 1 >= 1 and a[i - 1][j] == '.')
                    f_up[(i - 1) * m + j] = 1;
                if (i + 1 <= n and a[i + 1][j] == '.')
                    f_down[(i - 1) * m + j] = 1;
                if (j - 1 >= 1 and a[i][j - 1] == '.')
                    f_left[(i - 1) * m + j] = 1;
                if (j + 1 <= m and a[i][j + 1] == '.')
                    f_right[(i - 1) * m + j] = 1;
            }
        }
    }
    //cout << f_left.count() << ' ' << f_right.count() << ' ' << f_up.count() << ' ' << f_down.count() << endl;
    for (int q = 1; q <= k; q++)
    {
        bitset<250005> bs_up, bs_down, bs_left, bs_right;
        bs_up = dp[q - 1] << m;
        bs_down = dp[q - 1] >> m;
        bs_left = dp[q - 1] << 1;
        bs_right = dp[q - 1] >> 1;
        //cout << bs_left.count() << ' ' << bs_right.count() << ' ' << bs_up.count() << ' ' << bs_down.count() << endl;
        for (int i = 1; i <= n; i++)
        {
            bs_left[(i - 1) * m + 1] = 0;
            bs_right[i * m] = 0;
        }
        //cout << bs_left.count() << ' ' << bs_right.count() << ' ' << bs_up.count() << ' ' << bs_down.count() << endl;
        bs_up &= f_up;
        bs_down &= f_down;
        bs_left &= f_left;
        bs_right &= f_right;
        /*if (q == k)
        {
            for (int i = 1; i <= n; i++)
            {
                for (int j = 1; j <= m; j++)
                {
                    cout << (int)bs_left[(i - 1) * m + j];
                }
                cout << endl;
            }
            cout << endl;
            for (int i = 1; i <= n; i++)
            {
                for (int j = 1; j <= m; j++)
                {
                    cout << (int)bs_right[(i - 1) * m + j];
                }
                cout << endl;
            }
            cout << endl;
            for (int i = 1; i <= n; i++)
            {
                for (int j = 1; j <= m; j++)
                {
                    cout << (int)bs_up[(i - 1) * m + j];
                }
                cout << endl;
            }
            cout << endl;
            for (int i = 1; i <= n; i++)
            {
                for (int j = 1; j <= m; j++)
                {
                    cout << (int)bs_down[(i - 1) * m + j];
                }
                cout << endl;
            }
            cout << endl;
        }*/
        //cout << bs_left.count() << ' ' << bs_right.count() << ' ' << bs_up.count() << ' ' << bs_down.count() << endl;
        if (s[q] == '?')
            dp[q] = ((bs_up | bs_down) | bs_left) | bs_right;
        else if (s[q] == 'W')
            dp[q] = bs_right;
        else if (s[q] == 'E')
            dp[q] = bs_left;
        else if (s[q] == 'S')
            dp[q] = bs_up;
        else
            dp[q] = bs_down;
        //cout << dp[q].count() << endl;
        /*for (int i = 1; i <= n; i++)
        {
            for (int j = 1; j <= m; j++)
            {
                cout << (int)dp[q][(i - 1) * m + j];
            }
            cout << endl;
        }
        cout << endl;*/
    }
    cout << dp[k].count();
    return 0;
}

/**
5 9 7
...##....
..#.##..#
..#....##
.##...#..
....#....
WS?EE??
**/

/**
average problema de lot juniori pe care stie sa o bage doar un om
**/
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...