#include<bits/stdc++.h> #define FOR(i,a,b) for(int i=a;i<b;++i) #define FORD(i,a,b) for(int i=a;i>=b;--i) #define PB push_back #define EB emplace_back #define FI first #define SE second #define umap unordered_map #define uset unordered_set #define vi vector<int> #define vvi vector<vi> #define vll vector<ll> #define vvll vector<vll> #define vpii vector<pii> #define pii pair<int, int> #define pll pair<ll, ll> #define ALL(X) (X).begin(),(X).end() #ifndef DEBUG #define endl (char)10 #endif using namespace std; using ll = long long; using ld = long double; template <class T> istream& operator>> (istream& is, vector<T>& vec){ FOR(i,0,vec.size()) is >> vec[i]; return is; } template <class T> ostream& operator<< (ostream& os, vector<T>& vec){ for(auto& t : vec) os << t << " "; return os; } void st() { int n; string s, t; cin >> n >> s >> t; bool suk = (s == t); vvi V(n); FOR(i,1,n){ int a, b; cin >> a >> b; a--; b--; V[a].PB(b); V[b].PB(a); } vi cnt(2, 0); FOR(i,0,n) cnt[s[i] - '0']++; if (cnt[0] == 0 || cnt[1] == 0){ cout << (suk ? "TAK" : "NIE") << endl; return; } vi scnt(2); FOR(i,0,n){ if (V[i].size() >= 3){ scnt[0] = scnt[1] = 0; for(int x : V[i]) scnt[t[x] - '0']++; if (scnt[0] != 0 && scnt[1] != 0) suk = true; else if (scnt[t[i] - '0'] != 0) suk = true; } } vi karakany; bool suk2 = true; FOR(i,0,n){ if (V[i].size() < 3) karakany.PB(i); else if (s[i] != t[i]) suk2 = false; } vvi G(karakany.size()); FOR(i,0,karakany.size()){ for(int x : V[karakany[i]]){ auto it = lower_bound(ALL(karakany), x); if (it != karakany.end() && *it == x){ G[i].PB(it - karakany.begin()); } } } vi vis(karakany.size(), 0); FOR(i,0,karakany.size()){ if (vis[i] != 0 || G[i].size() > 1) continue; vis[i] = 1; if (G[i].size() == 0){ if (s[karakany[i]] != t[karakany[i]]) suk2 = false; } else { vi sciezka; int prv = -1; int v = i; sciezka.PB(karakany[i]); while(true){ if (G[v].size() == 1 && G[v][0] == prv) break; if (G[v][0] != prv){ prv = v; v = G[v][0]; } else { prv = v; v = G[v][1]; } vis[v] = 1; sciezka.PB(karakany[v]); } int pasu = 0; FOR(x,0,sciezka.size()){ while(pasu < sciezka.size() && s[sciezka[pasu]] != t[sciezka[x]]) pasu++; if (pasu == sciezka.size()) break; } if (pasu == sciezka.size()) suk2 = false; } } suk |= suk2; cout << (suk ? "TAK" : "NIE") << endl; } int main () { ios_base::sync_with_stdio(false); cin.tie(0); int t; cin >> t; FOR(i,0,t){ if (t < 50){ cerr << "-------------------" << endl; } //cout << "Case #" << i + 1 <<": "; st(); } }
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> #define FOR(i,a,b) for(int i=a;i<b;++i) #define FORD(i,a,b) for(int i=a;i>=b;--i) #define PB push_back #define EB emplace_back #define FI first #define SE second #define umap unordered_map #define uset unordered_set #define vi vector<int> #define vvi vector<vi> #define vll vector<ll> #define vvll vector<vll> #define vpii vector<pii> #define pii pair<int, int> #define pll pair<ll, ll> #define ALL(X) (X).begin(),(X).end() #ifndef DEBUG #define endl (char)10 #endif using namespace std; using ll = long long; using ld = long double; template <class T> istream& operator>> (istream& is, vector<T>& vec){ FOR(i,0,vec.size()) is >> vec[i]; return is; } template <class T> ostream& operator<< (ostream& os, vector<T>& vec){ for(auto& t : vec) os << t << " "; return os; } void st() { int n; string s, t; cin >> n >> s >> t; bool suk = (s == t); vvi V(n); FOR(i,1,n){ int a, b; cin >> a >> b; a--; b--; V[a].PB(b); V[b].PB(a); } vi cnt(2, 0); FOR(i,0,n) cnt[s[i] - '0']++; if (cnt[0] == 0 || cnt[1] == 0){ cout << (suk ? "TAK" : "NIE") << endl; return; } vi scnt(2); FOR(i,0,n){ if (V[i].size() >= 3){ scnt[0] = scnt[1] = 0; for(int x : V[i]) scnt[t[x] - '0']++; if (scnt[0] != 0 && scnt[1] != 0) suk = true; else if (scnt[t[i] - '0'] != 0) suk = true; } } vi karakany; bool suk2 = true; FOR(i,0,n){ if (V[i].size() < 3) karakany.PB(i); else if (s[i] != t[i]) suk2 = false; } vvi G(karakany.size()); FOR(i,0,karakany.size()){ for(int x : V[karakany[i]]){ auto it = lower_bound(ALL(karakany), x); if (it != karakany.end() && *it == x){ G[i].PB(it - karakany.begin()); } } } vi vis(karakany.size(), 0); FOR(i,0,karakany.size()){ if (vis[i] != 0 || G[i].size() > 1) continue; vis[i] = 1; if (G[i].size() == 0){ if (s[karakany[i]] != t[karakany[i]]) suk2 = false; } else { vi sciezka; int prv = -1; int v = i; sciezka.PB(karakany[i]); while(true){ if (G[v].size() == 1 && G[v][0] == prv) break; if (G[v][0] != prv){ prv = v; v = G[v][0]; } else { prv = v; v = G[v][1]; } vis[v] = 1; sciezka.PB(karakany[v]); } int pasu = 0; FOR(x,0,sciezka.size()){ while(pasu < sciezka.size() && s[sciezka[pasu]] != t[sciezka[x]]) pasu++; if (pasu == sciezka.size()) break; } if (pasu == sciezka.size()) suk2 = false; } } suk |= suk2; cout << (suk ? "TAK" : "NIE") << endl; } int main () { ios_base::sync_with_stdio(false); cin.tie(0); int t; cin >> t; FOR(i,0,t){ if (t < 50){ cerr << "-------------------" << endl; } //cout << "Case #" << i + 1 <<": "; st(); } } |