rt,考场上调了近三个小时,对拍也拍不出错,但是大样例一直是错的,回来一写民间数据过了。。
求 hack
#include<cstdio>
#include<cctype>
#include<array>
#include<ctime>
#include<vector>
#include<algorithm>
#include<initializer_list>
using namespace std;
namespace Main {
#define ld long double
#define Pii array<int, 2>
#define rep(i, l, r) for(int i(l); i <= (r); ++ i)
#define per(i, r, l) for(int i(r); i >= (l); -- i)
template<class T>
inline void cmin(T& x, const T& y) { x = min(x, y); }
template<class T>
inline void cmax(T& x, const T& y) { x = max(x, y); }
const int N = 1e5 + 5;
int n, ans;
int s[2][N];
int t[2][N];
void Input() {
scanf ("%d", &n);
static char str[N];
rep(fg, 0, 1) {
scanf ("%s", str + 1);
rep(i, 1, n)
s[fg][i] = str[i] - '0';
} rep(fg, 0, 1) {
scanf ("%s", str + 1);
rep(i, 1, n)
t[fg][i] = str[i] - '0';
}
}
int bel[2][N];
vector<Pii>b[2];
vector<Pii>ctb[2];
vector<Pii>sm;
vector<bool>tf[2];
vector<int>bl[2];
void Prew() {
b[0].clear(); b[1].clear(); ctb[0].clear(); ctb[1].clear();
rep(fg, 0, 1) for (int l = 1, r; l <= n; l = r + 1) {
r = l;
if (!t[fg][l]) continue;
while (t[fg][r + 1]) ++ r;
array<int, 2>ct = {0, 0};
rep(i, l, r) ++ ct[s[fg][i]],
bel[fg][i] = b[fg].size();
b[fg].emplace_back((Pii){l, r});
ctb[fg].emplace_back(ct);
} rep(fg, 0, 1) rep(i, 1, n) {
if (t[fg][i]) continue;
if (!t[fg ^ 1][i])
ans += fg * (s[0][i] == s[1][i]);
else if (ctb[fg ^ 1][bel[fg ^ 1][i]][s[fg][i]])
++ ans, -- ctb[fg ^ 1][bel[fg ^ 1][i]][s[fg][i]];
else -- ctb[fg ^ 1][bel[fg ^ 1][i]][s[fg][i] ^ 1];
} sm.clear(); tf[0].clear(); tf[1].clear(); bl[0].clear(); bl[1].clear();
for (int l = 1, r; l <= n; l = r + 1) {
r = l;
if (!t[0][l] || !t[1][l]) continue;
while (t[0][r + 1] && t[1][r + 1]) ++ r;
sm.emplace_back((Pii){l, r});
rep(fg, 0, 1) {
bl[fg].emplace_back(bel[fg][l]);
tf[fg].emplace_back(!t[fg][r + 1]);
}
}
}
void Solve() {
int len = sm.size() - 1;
rep(i, 0, len) {
int ct[2];
ct[0] = min(ctb[0][bl[0][i]][0], ctb[1][bl[1][i]][0]);
ct[1] = min(ctb[0][bl[0][i]][1], ctb[1][bl[1][i]][1]);
ans += ct[0] + ct[1];
if (tf[0][i] && tf[1][i]) continue;
int tr = 0, fl = 1;
if (tf[1][i]) swap(tr, fl);
rep(t, 0, 1)
ctb[fl][bl[fl][i]][t] -= ct[t],
ctb[tr][bl[tr][i]][t] -= ct[t];
rep(t, 0, 1)
ctb[fl][bl[fl][i]][t] -= ctb[tr][bl[tr][i]][t ^ 1];
}
}
void ERoRain() {
Input(); ans = 0;
Prew(); Solve();
printf ("%d\n", ans);
}
signed main() {
ld start_time = clock();
int T; scanf ("%d", &T);
while (T --) ERoRain();
fprintf(stderr, "Time : %Lfs\n", (clock() - start_time) / CLOCKS_PER_SEC);
return 0;
}
} signed main() {
// freopen("edit.in", "r", stdin);
// freopen("edit.out", "w", stdout);
Main::main();
return 0;
}