#include <bits/stdc++.h> using namespace std; typedef long long LL; const int MAX = 1e5+5; vector<int> tree[MAX]; string str1, str2; bool check(int root) { unordered_set<int> s; deque<int> q; q.push_back(root); s.insert(root); bool allOnes1 = true; bool allZeros1 = true; bool allOnes2 = true; bool allZeros2 = true; size_t maxDegree = 0; bool hasEdge = false; int deg1 = 0; while(!q.empty()) { int top = q.front(); q.pop_front(); if(str1[top-1] == '0') allOnes1 = false; else allZeros1 = false; if(str2[top-1] == '0') allOnes2 = false; else allZeros2 = false; if(maxDegree < tree[top].size()) { maxDegree = tree[top].size(); } if(tree[top].size() == 1) deg1 = top; for(int i = 0; i < tree[top].size(); ++i) { int v = tree[top][i]; if(str2[v-1] == str2[top-1]) hasEdge = true; if(s.count(v)) continue; q.push_back(v); s.insert(v); } } if(allOnes1 && allOnes2) return true; if(allOnes1 && !allOnes2) return false; if(allZeros1 && allZeros2) return true; if(allZeros1 && !allZeros2) return false; if(maxDegree < 3) { int v = deg1; int prev = 0; vector<int> g1, g2; while(1) { g1.push_back(str1[v-1]); g2.push_back(str2[v-1]); if(v != deg1 && tree[v].size() == 1) break; int next = tree[v].size() == 1 ? tree[v][0] : (tree[v][0] == prev ? tree[v][1] : tree[v][0]); prev = v; v = next; } vector<int> gg1, gg2; for(int i = 0; i < g1.size(); ++i) { if(i == 0 || g1[i] != g1[i-1]) gg1.push_back(g1[i]); if(i == 0 || g2[i] != g2[i-1]) gg2.push_back(g2[i]); } if(gg1.size() > gg2.size()) return true; if(gg1.size() < gg2.size()) return false; return gg1[0] == gg2[0]; } else { if(hasEdge) return true; } return false; } void solve() { int n, a, b; cin >> n; cin >> str1 >> str2; for(int i = 0; i <= n; ++i) tree[i].clear(); for(int i = 0; i < n-1; ++i) { cin >> a >> b; tree[a].push_back(b); tree[b].push_back(a); } if(str1 == str2 || check(1)) { cout << "TAK\n"; } else { cout << "NIE\n"; } } int main() { ios_base::sync_with_stdio(false); int t; cin >> t; while(t--) solve(); }
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 103 | #include <bits/stdc++.h> using namespace std; typedef long long LL; const int MAX = 1e5+5; vector<int> tree[MAX]; string str1, str2; bool check(int root) { unordered_set<int> s; deque<int> q; q.push_back(root); s.insert(root); bool allOnes1 = true; bool allZeros1 = true; bool allOnes2 = true; bool allZeros2 = true; size_t maxDegree = 0; bool hasEdge = false; int deg1 = 0; while(!q.empty()) { int top = q.front(); q.pop_front(); if(str1[top-1] == '0') allOnes1 = false; else allZeros1 = false; if(str2[top-1] == '0') allOnes2 = false; else allZeros2 = false; if(maxDegree < tree[top].size()) { maxDegree = tree[top].size(); } if(tree[top].size() == 1) deg1 = top; for(int i = 0; i < tree[top].size(); ++i) { int v = tree[top][i]; if(str2[v-1] == str2[top-1]) hasEdge = true; if(s.count(v)) continue; q.push_back(v); s.insert(v); } } if(allOnes1 && allOnes2) return true; if(allOnes1 && !allOnes2) return false; if(allZeros1 && allZeros2) return true; if(allZeros1 && !allZeros2) return false; if(maxDegree < 3) { int v = deg1; int prev = 0; vector<int> g1, g2; while(1) { g1.push_back(str1[v-1]); g2.push_back(str2[v-1]); if(v != deg1 && tree[v].size() == 1) break; int next = tree[v].size() == 1 ? tree[v][0] : (tree[v][0] == prev ? tree[v][1] : tree[v][0]); prev = v; v = next; } vector<int> gg1, gg2; for(int i = 0; i < g1.size(); ++i) { if(i == 0 || g1[i] != g1[i-1]) gg1.push_back(g1[i]); if(i == 0 || g2[i] != g2[i-1]) gg2.push_back(g2[i]); } if(gg1.size() > gg2.size()) return true; if(gg1.size() < gg2.size()) return false; return gg1[0] == gg2[0]; } else { if(hasEdge) return true; } return false; } void solve() { int n, a, b; cin >> n; cin >> str1 >> str2; for(int i = 0; i <= n; ++i) tree[i].clear(); for(int i = 0; i < n-1; ++i) { cin >> a >> b; tree[a].push_back(b); tree[b].push_back(a); } if(str1 == str2 || check(1)) { cout << "TAK\n"; } else { cout << "NIE\n"; } } int main() { ios_base::sync_with_stdio(false); int t; cin >> t; while(t--) solve(); } |