Submission #1308449

#TimeUsernameProblemLanguageResultExecution timeMemory
1308449purplelemonLamps (JOI19_lamps)C++20
100 / 100
58 ms95464 KiB
#include<bits/stdc++.h>
using namespace std;
#define int long long
#define eq(x) (A[i]==B[i]?x:1e18)
#define dif(x) (A[i]!=B[i]?x:1e18)
#define OP(i,j,k,x) dp[i][j][k] = min(dp[i][j][k],x);

const int N = 1e6 + 10;
int n;
int A[N], B[N], dp[N][5][2];


void solve() {
    cin >> n;
    string str;
    cin >> str;
    for (int i = 1;i <= n;i++) {
        A[i] = str[i-1]-'0';
    }
    cin >> str;
    for (int j = 1;j <= n;j++) {
        B[j] = str[j-1]-'0';
    }
    memset(dp,63,sizeof(dp));
    dp[1][0][0] = (A[1]!=B[1]);
    if (A[1] != B[1]) {
        dp[1][1][0] = 0;
        dp[1][1][1] = 0;
    }
    dp[1][2][0] = 0;
    dp[1][2][1] = 0;
    if (A[1] == B[1]) {
        dp[1][3][0] = 0;
        dp[1][3][1] = 0;
    } else {
        dp[1][3][B[1]] = 0;
        dp[1][3][1-B[1]] = 1;
    }
    dp[1][4][0] = 0;


    for (int i = 2;i <= n;i++) {
        if (A[i] == B[i]) dp[i][0][0] = min(dp[i][0][0],dp[i-1][0][0]);
        dp[i][0][0] = min(dp[i][0][0], 1 + dp[i-1][3][B[i]]);
        if (A[i] != B[i]) dp[i][0][0] = min(dp[i][0][0],1+dp[i-1][4][0]);

        if (B[i] == B[i+1]) {
            dp[i][1][1-B[i]] = dp[i-1][1][1-B[i]];
        }
        if (A[i] != B[i]) {
            dp[i][1][0] = min(dp[i][1][0],dp[i-1][4][0]);
            dp[i][1][1] = min(dp[i][1][1],dp[i-1][4][0]);
        }

        if (B[i] == B[i+1]) dp[i][2][1-B[i]] = dp[i-1][2][1-B[i]];
        dp[i][2][B[i]] = min(dp[i][2][B[i]],dp[i-1][3][B[i]]);
        if (A[i] != B[i]) {
            dp[i][2][0] = min(dp[i][2][0],dp[i-1][4][0]);
            dp[i][2][1] = min(dp[i][2][1],dp[i-1][4][0]);
        }

        dp[i][3][0] = dp[i-1][3][0];
        dp[i][3][1] = dp[i-1][3][1];
        if (B[i] != B[i+1]) {
            dp[i][3][1-B[i]]++;
        }
        if (A[i] != B[i]) {
            dp[i][3][0] = min(dp[i][3][0],1+dp[i-1][4][0]);
            dp[i][3][1] = min(dp[i][3][1],1+dp[i-1][4][0]);
        }
        if (A[i] == B[i]) {
            dp[i][3][0] = min(dp[i][3][0],dp[i-1][0][0]);
            dp[i][3][1] = min(dp[i][3][1],dp[i-1][0][0]);
        }
        dp[i][3][1-B[i]] = min(dp[i][3][1-B[i]],1+dp[i-1][2][1-B[i]]);

        if (A[i] != B[i]) {
            dp[i][4][0] = dp[i-1][4][0];
        }
        if (A[i] == B[i]) {
            dp[i][4][0] = min(dp[i][4][0],dp[i-1][0][0]);
        }
        dp[i][4][0] = min(dp[i][4][0],1+dp[i-1][2][1-B[i]]);
        dp[i][4][0] = min(dp[i][4][0],1+dp[i-1][3][B[i]]); 
    }
    cout << dp[n][0][0];
}

int32_t main() {
    ios::sync_with_stdio(0);
    cin.tie(0);
    cout.tie(0);
    solve();
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...