제출 #947866

#제출 시각아이디문제언어결과실행 시간메모리
947866danikoynovLamps (JOI19_lamps)C++14
100 / 100
65 ms51320 KiB
#include<bits/stdc++.h>
#define endl '\n'

using namespace std;
typedef long long ll;

void speed()
{
    ios_base::sync_with_stdio(false);
    cin.tie(NULL);
    cout.tie(NULL);
}

const int maxn = 1e6 + 10;

int n;
string a, b;

/**
0 - no operations
1 - set 0 = 0
2 - set 1 = 1
3 - toggle = switch
4 - set 0 toggle = 1
5 - set 1 toggle = 0
*/

const int maxmask = 6;
int path[maxmask][maxmask], to[2][maxmask];
void precompute_masks()
{
    to[0][0] = 0;
    to[1][0] = 1;

    to[0][1] = 0;
    to[1][1] = 0;

    to[0][2] = 1;
    to[1][2] = 1;

    to[0][3] = 1;
    to[1][3] = 0;

    to[0][4] = 1;
    to[1][4] = 1;

    to[0][5] = 0;
    to[1][5] = 0;

    path[0][0] = 0;
    path[0][1] = 1;
    path[0][2] = 1;
    path[0][3] = 1;
    path[0][4] = 2;
    path[0][5] = 2;

    path[1][0] = 0;
    path[1][1] = 0;
    path[1][2] = 1;
    path[1][3] = 1;
    path[1][4] = 1;
    path[1][5] = 2;

    path[2][0] = 0;
    path[2][1] = 1;
    path[2][2] = 0;
    path[2][3] = 1;
    path[2][4] = 2;
    path[2][5] = 1;

    path[3][0] = 0;
    path[3][1] = 1;
    path[3][2] = 1;
    path[3][3] = 0;
    path[3][4] = 1;
    path[3][5] = 1;

    path[4][0] = 0;
    path[4][1] = 0;
    path[4][2] = 1;
    path[4][3] = 0;
    path[4][4] = 0;
    path[4][5] = 1;

    path[5][0] = 0;
    path[5][1] = 1;
    path[5][2] = 0;
    path[5][3] = 0;
    path[5][4] = 1;
    path[5][5] = 0;
}

int dp[maxn][maxmask], f[maxn][maxmask];
void solve()
{
    cin >> n >> a >> b;

    precompute_masks();
    a = "#" + a;
    b = "#" + b;

    for (int i = 0; i <= n; i ++)
    {
        for (int mask = 0; mask < maxmask; mask ++)
            dp[i][mask] = 1e9, f[i][mask] = -1;
    }

    dp[0][0] = 0;
    for (int i = 1; i <= n; i ++)
    {
        for (int mask = 0; mask < maxmask; mask ++)
        {
            if (to[a[i] - '0'][mask] != b[i] - '0')
                continue;

            for (int from = 0; from < maxmask; from ++)
            {
                int val = dp[i - 1][from] + path[from][mask];
                if (val < dp[i][mask])
                {
                    dp[i][mask] = val;
                    f[i][mask] = from;
                }
            }
        }
        /**cout << "--------------------" << endl;
        for (int mask = 0; mask < maxmask; mask ++)
        {
            cout << dp[i][mask] << " ";
        }
        cout << endl;

                for (int mask = 0; mask < maxmask; mask ++)
        {
            cout << f[i][mask] << " ";
        }
        cout << endl;*/
    }

    int ans = 1e9;
    for (int mask = 0; mask < maxmask; mask ++)
        ans = min(ans, dp[n][mask]);

    cout << ans << endl;

}

int main()
{
    speed();
    int t = 1;
    ///cin >> t;
    while(t --)
        solve();
    return 0;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...