Submission #623834

#TimeUsernameProblemLanguageResultExecution timeMemory
623834ArnchLamps (JOI19_lamps)C++17
100 / 100
78 ms35224 KiB
// oooo
/*
 har chi delet mikhad bebar ~
 gitar o ba khodet nabar! ~
 ;Amoo_Hasan;
*/

#include<bits/stdc++.h>
//#pragma GCC optimize("O3,no-stack-protector,unroll-loops")
//#pragma GCC target("avx2,fma")

using namespace std;

typedef long long ll;
typedef long double ld;

#define Sz(x) int((x).size())
#define All(x) (x).begin(), (x).end()
#define wtf(x) cout<<#x <<" : " <<x <<endl

constexpr ll inf = 1e18, N = 1e6 + 10, mod = 1e9 + 7, pr = 1000696969;

ll dp[N][3];
int A[N], B[N];

int main() {
    ios :: sync_with_stdio(0), cin.tie(0);

	int n; cin >>n;
	string a, b; cin >>a >>b;

	for(int i = 0; i < n; i++) {
		A[i + 1] = (a[i] - '0') + 1;
		B[i + 1] = (b[i] - '0') + 1;
	}

	memset(dp, 63, sizeof(dp));
	dp[0][0] = 0;

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

	/*for(int i = 1; i <= n; i++) {
		for(int j = 0; j < 3; j++) {
			cout<<"^^" <<i <<" " <<j <<" " <<dp[i][j] / 2 <<endl;
		}
	}*/

	ll ans = inf;
	for(int i = 0; i < 3; i++) ans = min(ans, dp[n][i]);

	cout<<ans / 2;

    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...