This submission is migrated from previous version of oj.uz, which used different machine for grading. This submission may have different result if resubmitted.
#include <bits/stdc++.h>
using namespace std;
#define X first
#define Y second
#define pb push_back
typedef long long ll;
typedef pair<ll, ll> ii;
#define MAXN 1001001
int n, reza = 0;
char a[MAXN], b[MAXN];
int fl[MAXN], t0[MAXN], t1[MAXN], fif[MAXN], fib[MAXN], cf[MAXN], c0[MAXN], c1[MAXN], cfr[MAXN];
int alt_reza = 0;
int main()
{
scanf("%d", &n);
scanf("%s", a);
scanf("%s", b);
for (int i = 0; i < n; i++) {
fl[i] = a[i] != b[i];
t0[i] = b[i] == '0';
t1[i] = b[i] == '1';
}
for (int i = 0; i < n; i++) {
if (i == 0) {
fif[i] = 0;
fib[i] = 0;
} else {
if (fl[i]) fif[i] = fl[i - 1] ? fif[i - 1] : i;
fib[i] = t0[i - 1] == t0[i] ? fib[i - 1] : i;
cf[i] = cf[i - 1];
c0[i] = c0[i - 1];
c1[i] = c1[i - 1];
}
if (i == n - 1 || (i < n - 1 && fl[i] && !fl[i + 1])) {
cf[i]++;
}
if (i == n - 1 || (i < n - 1 && t0[i] && !t0[i + 1])) {
c0[i]++;
alt_reza++;
}
if (i == n - 1 || (i < n - 1 && t1[i] && !t1[i + 1])) {
c1[i]++;
if (i < n - 1) alt_reza++;
}
//cout << i<<": "<<fl[i]<<' '<<t0[i]<<' '<<t1[i]<<' '<<fif[i]<<' '<<fib[i]<<' '<<cf[i]<<' '<<c0[i]<<' '<<c1[i]<<endl;
}
for (int i = n - 1; i >= 0; i--) {
if (i < n - 1) {
cfr[i] = cfr[i + 1];
}
if (!i || (i && fl[i] && !fl[i - 1])) {
cfr[i]++;
}
}
for (int i = 0; i < n; i++) {
if (i < n - 1 && fl[i] == fl[i + 1]) continue;
if (!fl[i]) continue;
reza++;//cout<<i<<' ';
}//cout<<endl;
int i2 = 0, i3 = 0;
for (; i2 < n; i2++) {
if (t0[i2]) break;
}
for (; i3 < n; i3++) {
if (t1[i3]) break;
}
if (max(i2 - 1, i3 - 1) >= 0) reza -= max(0, cf[max(i2 - 1, i3 - 1)] - 1);//printf("%d\n", reza);
i2 = n - 1; i3 = n - 1;
for (; i2 >= 0; i2--) {
if (t0[i2]) break;
}
for (; i3 >= 0; i3--) {
if (t1[i3]) break;
}
if (min(i2 + 1, i3 + 1) < n && i2 >= 0 && i3 >= 0) reza -= max(0, cfr[min(i2 + 1, i3 + 1)] - 1);//printf("%d\n", reza);
for (int i = 0; i < n; i++) {
if (!t1[i] || (i < n - 1 && t1[i + 1])) continue;
if (i == n - 1 || fib[i] == 0) continue;
int ccc = fl[fib[i]];
if (fl[fib[i] - 1] && fl[i + 1]) reza -= max(0, cf[i] - cf[fib[i] - 1] - ccc);//cout<<i<<'.'<<reza<<' '<<fib[i]<<' '<<fl[fib[i]-1]<<' '<<cf[i]<<' '<<cf[fib[i]-1]<<' '<<ccc<<endl;
if (!fl[fib[i] - 1] && fl[i + 1]) reza -= max(0, cf[i] - cf[fib[i] - 1] - 1);//cout<<i<<'.'<<reza<<endl;
if (fl[fib[i] - 1] && !fl[i + 1]) reza -= max(0, cf[i] - cf[fib[i] - 1] - ccc - 1);//cout<<i<<'.'<<reza<<endl;
if (!fl[fib[i] - 1] && !fl[i + 1]) reza -= max(0, cf[i] - cf[fib[i] - 1] - 1);//cout<<i<<'.'<<reza<<endl;
}//printf("%d\n", reza);
for (int i = 0; i < n; i++) {
if (!t0[i] || (i < n - 1 && t0[i + 1])) continue;
if (i == n - 1 || fib[i] == 0) continue;
int ccc = fl[fib[i]];
if (fl[fib[i] - 1] && fl[i + 1]) reza -= max(0, cf[i] - cf[fib[i] - 1] - ccc);
if (!fl[fib[i] - 1] && fl[i + 1]) reza -= max(0, cf[i] - cf[fib[i] - 1] - 1);
if (fl[fib[i] - 1] && !fl[i + 1]) reza -= max(0, cf[i] - cf[fib[i] - 1] - ccc - 1);
if (!fl[fib[i] - 1] && !fl[i + 1]) reza -= max(0, cf[i] - cf[fib[i] - 1] - 1);
}
reza = min(reza, alt_reza);
printf("%d\n", reza);
return 0;
}
Compilation message (stderr)
lamp.cpp: In function 'int main()':
lamp.cpp:17:7: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
scanf("%d", &n);
~~~~~^~~~~~~~~~
lamp.cpp:18:7: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
scanf("%s", a);
~~~~~^~~~~~~~~
lamp.cpp:19:7: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
scanf("%s", b);
~~~~~^~~~~~~~~
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |