#include <bits/stdc++.h>
using namespace std;
pair<int, int> cnt(string& s) {
pair<int, int> res;
for (auto& c : s) {
if (c == '0') {
res.first++;
} else {
res.second++;
}
}
return res;
}
int get_deg3plus(vector<vector<int>>& adj) {
for (int i = 0; i < adj.size(); i++) {
if (adj[i].size() > 2) {
return i;
}
}
return -1;
}
int get_deg1(vector<vector<int>>& adj) {
for (int i = 0; i < adj.size(); i++) {
if (adj[i].size() == 1) {
return i;
}
}
return -1;
}
vector<int> traverse(vector<vector<int>>& adj, int start) {
vector<int> res(adj.size());
res[0] = start;
res[1] = adj[start][0];
for (int i = 2; i < adj.size(); i++) {
auto& nbrs = adj[res[i - 1]];
res[i] = (nbrs[0] != res[i - 2]) ? nbrs[0] : nbrs[1];
}
return res;
}
bool answer(string& c0, string& c1, vector<vector<int>>& adj) {
if (c0 == c1) {
return true;
}
auto p0 = cnt(c0);
auto p1 = cnt(c1);
if ((p1.first > 0 && p0.first == 0) || (p1.second > 0 && p0.second == 0)) {
// missing color needed on final
return false;
}
if (p1.first == 0 || p1.second == 0) {
// single color on final
return true;
}
// if (n==1) { // already done...
int v3_node = get_deg3plus(adj); // any... if present
if (v3_node != -1) {
// possible if there exists 2 neighbours with same color
for (int i = 0; i < adj.size(); i++) {
for (int j : adj[i]) {
if (c1[i] == c1[j]) {
return true;
}
}
}
return false;
}
// just a line
vector<int> line_order = traverse(adj, get_deg1(adj));
// linear check looking for target letters
int i0 = 0;
for (int i1 = 0; i1 < line_order.size(); i1++) {
auto& need_c = c1[line_order[i1]];
while (c0[line_order[i0]] != need_c) {
i0++;
if (i0 == line_order.size()) {
return false;
}
}
}
return true;
}
int main() {
// freopen("D:/szkola/testy/dcc/dcc0.in", "r", stdin);
ios_base::sync_with_stdio(0);
cin.tie(0);
int t;
cin >> t;
while (t--) {
int n;
cin >> n;
string c0, c1; // colors
cin >> c0 >> c1;
vector<vector<int>> adj(n);
for (int i = 0; i < n - 1; i++) {
int a, b;
cin >> a >> b;
a--;
b--;
adj[a].push_back(b);
adj[b].push_back(a);
}
if (answer(c0, c1, adj)) {
cout << "TAK\n";
} else {
cout << "NIE\n";
}
}
}
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 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 | #include <bits/stdc++.h> using namespace std; pair<int, int> cnt(string& s) { pair<int, int> res; for (auto& c : s) { if (c == '0') { res.first++; } else { res.second++; } } return res; } int get_deg3plus(vector<vector<int>>& adj) { for (int i = 0; i < adj.size(); i++) { if (adj[i].size() > 2) { return i; } } return -1; } int get_deg1(vector<vector<int>>& adj) { for (int i = 0; i < adj.size(); i++) { if (adj[i].size() == 1) { return i; } } return -1; } vector<int> traverse(vector<vector<int>>& adj, int start) { vector<int> res(adj.size()); res[0] = start; res[1] = adj[start][0]; for (int i = 2; i < adj.size(); i++) { auto& nbrs = adj[res[i - 1]]; res[i] = (nbrs[0] != res[i - 2]) ? nbrs[0] : nbrs[1]; } return res; } bool answer(string& c0, string& c1, vector<vector<int>>& adj) { if (c0 == c1) { return true; } auto p0 = cnt(c0); auto p1 = cnt(c1); if ((p1.first > 0 && p0.first == 0) || (p1.second > 0 && p0.second == 0)) { // missing color needed on final return false; } if (p1.first == 0 || p1.second == 0) { // single color on final return true; } // if (n==1) { // already done... int v3_node = get_deg3plus(adj); // any... if present if (v3_node != -1) { // possible if there exists 2 neighbours with same color for (int i = 0; i < adj.size(); i++) { for (int j : adj[i]) { if (c1[i] == c1[j]) { return true; } } } return false; } // just a line vector<int> line_order = traverse(adj, get_deg1(adj)); // linear check looking for target letters int i0 = 0; for (int i1 = 0; i1 < line_order.size(); i1++) { auto& need_c = c1[line_order[i1]]; while (c0[line_order[i0]] != need_c) { i0++; if (i0 == line_order.size()) { return false; } } } return true; } int main() { // freopen("D:/szkola/testy/dcc/dcc0.in", "r", stdin); ios_base::sync_with_stdio(0); cin.tie(0); int t; cin >> t; while (t--) { int n; cin >> n; string c0, c1; // colors cin >> c0 >> c1; vector<vector<int>> adj(n); for (int i = 0; i < n - 1; i++) { int a, b; cin >> a >> b; a--; b--; adj[a].push_back(b); adj[b].push_back(a); } if (answer(c0, c1, adj)) { cout << "TAK\n"; } else { cout << "NIE\n"; } } } |
English