#include <cstdio> #include <vector> #include <queue> #include <string> using namespace std; const int N = 100000 + 5; char buf1[N]; char buf2[N]; int nextInt() { int n; scanf("%d", &n); return n; } int n; vector<vector<int> > g; vector<int> deg; int maxDeg; bool solve() { string s1(buf1); string s2(buf2); if (s1 == s2) return true; if (s1 == string(n, '0')) return false; if (s1 == string(n, '1')) return false; if (maxDeg > 2) { for (int i = 0; i < n; ++i) for (int j = 0; j < g[i].size(); ++j) if (buf2[i] == buf2[g[i][j]]) return true; return false; } vector<int> leaf; int cnt1 = 0; int cnt2 = 0; for (int i = 0; i < n; ++i) { if (deg[i] == 1) leaf.push_back(i); for (int j = 0; j < g[i].size(); ++j) { int ii = g[i][j]; if (buf1[i] != buf1[ii]) ++cnt1; if (buf2[i] != buf2[ii]) ++cnt2; } } if (cnt1 < cnt2) return false; if (cnt1 > cnt2) return true; if (buf1[leaf[0]] == buf2[leaf[0]]) return true; return false; } int main() { int TC = nextInt(); for (int tc = 0; tc < TC; ++tc) { n = nextInt(); scanf("%s%s", buf1, buf2); g.clear(); g.resize(n, vector<int>()); deg.clear(); deg.resize(n, 0); maxDeg = 0; for (int i = 1; i < n; ++i) { int a = nextInt() - 1; int b = nextInt() - 1; g[a].push_back(b); g[b].push_back(a); ++deg[a]; ++deg[b]; if (deg[a] > maxDeg) maxDeg = deg[a]; if (deg[b] > maxDeg) maxDeg = deg[b]; } bool res = solve(); printf("%s\n", res ? "TAK" : "NIE"); } 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 | #include <cstdio> #include <vector> #include <queue> #include <string> using namespace std; const int N = 100000 + 5; char buf1[N]; char buf2[N]; int nextInt() { int n; scanf("%d", &n); return n; } int n; vector<vector<int> > g; vector<int> deg; int maxDeg; bool solve() { string s1(buf1); string s2(buf2); if (s1 == s2) return true; if (s1 == string(n, '0')) return false; if (s1 == string(n, '1')) return false; if (maxDeg > 2) { for (int i = 0; i < n; ++i) for (int j = 0; j < g[i].size(); ++j) if (buf2[i] == buf2[g[i][j]]) return true; return false; } vector<int> leaf; int cnt1 = 0; int cnt2 = 0; for (int i = 0; i < n; ++i) { if (deg[i] == 1) leaf.push_back(i); for (int j = 0; j < g[i].size(); ++j) { int ii = g[i][j]; if (buf1[i] != buf1[ii]) ++cnt1; if (buf2[i] != buf2[ii]) ++cnt2; } } if (cnt1 < cnt2) return false; if (cnt1 > cnt2) return true; if (buf1[leaf[0]] == buf2[leaf[0]]) return true; return false; } int main() { int TC = nextInt(); for (int tc = 0; tc < TC; ++tc) { n = nextInt(); scanf("%s%s", buf1, buf2); g.clear(); g.resize(n, vector<int>()); deg.clear(); deg.resize(n, 0); maxDeg = 0; for (int i = 1; i < n; ++i) { int a = nextInt() - 1; int b = nextInt() - 1; g[a].push_back(b); g[b].push_back(a); ++deg[a]; ++deg[b]; if (deg[a] > maxDeg) maxDeg = deg[a]; if (deg[b] > maxDeg) maxDeg = deg[b]; } bool res = solve(); printf("%s\n", res ? "TAK" : "NIE"); } return 0; } |