赛时思路,已AC,但怕被CCF数据制裁
#include <bits/stdc++.h>
using namespace std;
const int N = 1e5 + 5;
int t, n, pos1[N], pos2[N], cnt1[N][2], cnt2[N][2];
int main() {
cin >> t;
while(t--) {
int l1 = 1, l2 = 1, ans = 0;
memset(cnt1, 0, sizeof(cnt1));memset(cnt2, 0, sizeof(cnt2));memset(pos1, 0, sizeof(pos1));memset(pos2, 0, sizeof(pos2));
string s1, s2, t1, t2;
cin >> n >> s1 >> s2 >> t1 >> t2;
for (int i = 0; i < n; i++) {
if (t1[i] == '0') l1++;
else pos1[i] = l1;
if (t2[i] == '0') l2++;
else pos2[i] = l2;
}
for (int i = 0; i < n; i++) {if (pos1[i]) cnt1[pos1[i]][s1[i] - '0']++; if (pos2[i]) cnt2[pos2[i]][s2[i] - '0']++;}
for (int i = 0; i < n; i++) {
if (t1[i] == '0' && t2[i] == '0' && s1[i] == s2[i]) ans++;
else if (t1[i] == '1' && t2[i] == '0' && cnt1[pos1[i]][s2[i] - '0']) cnt1[pos1[i]][s2[i] - '0']--, ans++;
else if (t1[i] == '0' && t2[i] == '1' && cnt2[pos2[i]][s1[i] - '0']) cnt2[pos2[i]][s1[i] - '0']--, ans++;
}
for (int i = 0; i < n; i++) {
if (t1[i] == '1' && t2[i] == '1') {
if (cnt1[pos1[i]][0] && cnt2[pos2[i]][0]) cnt2[pos2[i]][0]--, cnt1[pos1[i]][0]--, ans++;
else if (cnt1[pos1[i]][1] && cnt2[pos2[i]][1]) cnt2[pos2[i]][1]--, cnt1[pos1[i]][1]--, ans++;
}
}
printf("%d\n", ans);
}
return 0;
}