#include <bits/stdc++.h> using namespace std; using ll = long long; int n; vector<int> adj[100009]; bool state[2][100009]; int deg[100009]; int red[2], black[2]; int main() { ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0); int t; cin >> t; for(int tt=0; tt<t; tt++) { int a,b; char c; cin >> n; for(int k = 0; k < 2; k++) { for(int i = 1; i <= n; i++) { cin >> c; state[k][i] = (c == '1'); if(state[k][i]) black[k]++; else red[k]++; } } for(int i = 0; i < n-1; i++) { cin >> a >> b; adj[a].push_back(b); adj[b].push_back(a); deg[a]++; deg[b]++; } bool path = true; vector<int> leaves; for(int i = 1; i <= n; i++) { if(deg[i] == 1 and leaves.size() < 2) leaves.push_back(i); if(deg[i] > 2) path = false; } if(n == 1) { if(state[0][1] != state[1][1]) cout << "NIE\n"; else cout << "TAK\n"; } else { if(path) { int last = 0, curr = leaves[0]; string s[2] = {"", ""}; do { if(last == 0 or state[0][last] != state[0][curr]) s[0] += (state[0][curr] ? '1' : '0'); if(last == 0 or state[1][last] != state[1][curr]) s[1] += (state[1][curr] ? '1' : '0'); if(last == 0) { last = curr; curr = adj[curr][0]; } else { if(last != adj[curr][0]) { last = curr; curr = adj[curr][0]; } else { last = curr; curr = adj[curr][1]; } } } while(last != leaves[1]); if(s[0].length() > s[1].length() or s[0] == s[1]) cout << "TAK\n"; else cout << "NIE\n"; } else { if((black[0] == 0 and black[1] > 0) or (red[0] == 0 and red[1] > 0)) cout << "NIE\n"; else cout << "TAK\n"; } } for(int i = 0; i <= n+5; i++) { adj[i].clear(); deg[i] = 0; state[0][i] = state[1][i] = 0; } red[0] = red[1] = 0; black[0] = black[1] = 0; } return 0; }
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 | #include <bits/stdc++.h> using namespace std; using ll = long long; int n; vector<int> adj[100009]; bool state[2][100009]; int deg[100009]; int red[2], black[2]; int main() { ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0); int t; cin >> t; for(int tt=0; tt<t; tt++) { int a,b; char c; cin >> n; for(int k = 0; k < 2; k++) { for(int i = 1; i <= n; i++) { cin >> c; state[k][i] = (c == '1'); if(state[k][i]) black[k]++; else red[k]++; } } for(int i = 0; i < n-1; i++) { cin >> a >> b; adj[a].push_back(b); adj[b].push_back(a); deg[a]++; deg[b]++; } bool path = true; vector<int> leaves; for(int i = 1; i <= n; i++) { if(deg[i] == 1 and leaves.size() < 2) leaves.push_back(i); if(deg[i] > 2) path = false; } if(n == 1) { if(state[0][1] != state[1][1]) cout << "NIE\n"; else cout << "TAK\n"; } else { if(path) { int last = 0, curr = leaves[0]; string s[2] = {"", ""}; do { if(last == 0 or state[0][last] != state[0][curr]) s[0] += (state[0][curr] ? '1' : '0'); if(last == 0 or state[1][last] != state[1][curr]) s[1] += (state[1][curr] ? '1' : '0'); if(last == 0) { last = curr; curr = adj[curr][0]; } else { if(last != adj[curr][0]) { last = curr; curr = adj[curr][0]; } else { last = curr; curr = adj[curr][1]; } } } while(last != leaves[1]); if(s[0].length() > s[1].length() or s[0] == s[1]) cout << "TAK\n"; else cout << "NIE\n"; } else { if((black[0] == 0 and black[1] > 0) or (red[0] == 0 and red[1] > 0)) cout << "NIE\n"; else cout << "TAK\n"; } } for(int i = 0; i <= n+5; i++) { adj[i].clear(); deg[i] = 0; state[0][i] = state[1][i] = 0; } red[0] = red[1] = 0; black[0] = black[1] = 0; } return 0; } |