//10:02 ��B���ַ��� #include using namespace std; typedef unsigned long long ull; typedef long long ll; const int N = 1e5+5; bool s0[N], s1[N], t0[N], t1[N]; int T, n; char inp[N]; int l = 1, r0 = 1, r1 = 1, cnt0[2], cnt1[2]; inline void solve() { ll ans = 0; while(1) { if(r0 > n+1 && r1 > n+1) break; while(t0[r0] && r0<=n) { cnt0[s0[r0]]++; r0++; } while(t1[r1] && r1<=n) { cnt1[s1[r1]]++; r1++; } // printf("try[%d, %d][%d, %d]cnt0(%d, %d), cnt1(%d, %d)%d -> ", l, r0, l, r1, cnt0[0], cnt0[1], cnt1[0], cnt1[1], ans); if(r0 == r1)//A/B { ans += min(cnt0[0], cnt1[0])+min(cnt0[1], cnt1[1]); ans += (s0[r0]==s1[r1]); // printf("%d cnt0(%d, %d), cnt1(%d, %d)\n", ans, cnt0[0], cnt0[1], cnt1[0], cnt1[1]); l = r0+1; r0++; r1++; cnt0[0] = cnt1[0] = cnt0[1] = cnt1[1] = 0; // printf("%d cnt0(%d, %d), cnt1/(%d, %d)\n", ans, cnt0[0], cnt0[1], cnt1[0], cnt1[1]); continue; } if(r0 < r1) { // printf("tag1:cnt0(%d, %d), cnt1(%d, %d)\n", cnt0[0], cnt0[1], cnt1[0], cnt1[1]); if(cnt0[0]<=cnt1[0]) { ans += cnt0[0]; cnt1[0]-=cnt0[0]; cnt0[0] = 0; // printf("tag2:cnt0(%d, %d), cnt1(%d, %d)\n", cnt0[0], cnt0[1], cnt1[0], cnt1[1]); if(cnt0[1]<=cnt1[1]) { ans += cnt0[1]; cnt1[1]-=cnt0[1]; cnt0[1] = 0; } else { ans+=cnt1[1]; cnt0[1]-=cnt1[1]; cnt1[1] = 0; cnt1[0]-=cnt0[1]; cnt0[1] = 0; } // printf("tag3:cnt0(%d, %d), cnt1(%d, %d)\n", cnt0[0], cnt0[1], cnt1[0], cnt1[1]); } else { ans+=cnt1[0]; cnt0[0]-=cnt1[0]; cnt1[0] = 0; cnt1[1]-=cnt0[0]; cnt0[0] = 0; if(cnt0[1]<=cnt1[1]) { ans += cnt0[1]; cnt1[1]-=cnt0[1]; cnt0[1] = 0; } else { ans+=cnt1[1]; cnt0[1]-=cnt1[1]; cnt1[1] = 0; cnt1[0]-=cnt0[1]; cnt0[1] = 0; } } if(cnt1[s0[r0]]) { // printf("checks0r0:%d\n", s0[r0]); cnt1[s0[r0]]--; ans++; } else { // printf("checks0r0:%d\n", s0[r0]); cnt1[!s0[r0]]--; } l = r0+1, r0 = r0+1; // printf("%d cnt0(%d, %d), cnt1/(%d, %d)\n", ans, cnt0[0], cnt0[1], cnt1[0], cnt1[1]); continue; } if(r0 > r1) { // printf("tag4:cnt0(%d, %d), cnt1(%d, %d)\n", cnt0[0], cnt0[1], cnt1[0], cnt1[1]); if(cnt1[0]<=cnt0[0]) { ans += cnt1[0]; cnt0[0]-=cnt1[0]; cnt1[0] = 0; // printf("tag5:cnt0(%d, %d)/, cnt1(%d, %d)\n", cnt0[0], cnt0[1], cnt1[0], cnt1[1]); if(cnt1[1]<=cnt0[1]) { ans += cnt1[1]; cnt0[1]-=cnt1[1]; cnt1[1] = 0; } else { ans+=cnt0[1]; cnt1[1]-=cnt0[1]; cnt0[1] = 0; cnt0[0]-=cnt1[1]; cnt1[1] = 0; } // printf("tag6:cnt0(%d, %d), cnt1(%d, %d)\n", cnt0[0], cnt0[1], cnt1[0], cnt1[1]); } else { ans+=cnt0[0]; cnt1[0]-=cnt0[0]; cnt0[0] = 0; cnt0[1]-=cnt1[0]; cnt1[0] = 0; if(cnt1[1]<=cnt0[1]) { ans += cnt1[1]; cnt0[1]-=cnt1[1]; cnt1[1] = 0; } else { ans+=cnt0[1]; cnt1[1]-=cnt0[1]; cnt0[1] = 0; cnt0[0]-=cnt1[1]; cnt1[1]=0; } } if(cnt0[s1[r1]]) { cnt0[s1[r1]]--; ans++; } else { cnt0[!s1[r1]]--; } l = r1+1, r1 = r1+1; // printf("%d cnt0(%d, %d), cnt1(%d, %d)\n", ans, cnt0[0], cnt0[1], cnt1[0], cnt1[1]); } } printf("%lld\n", ans); } inline void clear() { l = 1, r0 = 1, r1 = 1, cnt0[1]=cnt0[0] = cnt1[0] = cnt1[1] = 0; } inline void solveA() { ll ans = 0; for(int i = 1; i <= n; i++) { if(s1[i] == s0[1]) ans++; } printf("%lld\n", ans); } inline void solveB() { int ans = 0; while(1) { if(r0 > n || r1 > n) break; while(t0[r0] && r0<=n) { cnt0[s0[r0]]++; r0++; } while(t1[r1]&&r1<=n) { cnt1[s1[r1]]++; r1++; } if(r0 == r1)//A/B { ans += min(cnt0[0], cnt1[0])+min(cnt0[1], cnt1[1]); ans += (s0[r0]==s1[r1]); l = r0; r0++; r1++; cnt0[0] = cnt1[0] = cnt0[1] = cnt1[1] = 0; continue; } } printf("%d\n", ans); } int main() { freopen("edit.in", "r", stdin); freopen("edit.out", "w", stdout); scanf("%d", &T); for(int test = 0; test < T; test++) { scanf("%d%s", &n, inp); for(int i = 1; i <= n; i++) { s0[i] = inp[i-1]-'0'; } scanf("%s", inp); for(int i = 1; i <= n; i++) { s1[i] = inp[i-1]-'0'; } scanf("%s", inp); for(int i = 1; i <= n; i++) { t0[i] = inp[i-1]-'0'; } scanf("%s", inp); for(int i = 1; i <= n; i++) { t1[i] = inp[i-1]-'0'; } t0[n+1] = 0; t1[n+1] = 0; s0[n+1] = 1; s1[n+1] = 0; bool flagA = true; for(int i = 1; i <= n; i++) { if(s0[i] != s0[1]) { flagA = false; break; } } bool flagB = true; for(int i = 1; i <= n; i++) { if(t0[i] != t1[i]) { flagB = false; break; } } if(!flagA) { if(flagB) { solveB(); } else { solve(); } } else { solveA(); } clear(); // printf("aaaa\n\n\n\n\n\n"); } return 0; }