#include <iostream>
#include <string>
#include <vector>
#include <queue>
using namespace std;
string s1,s2;
int n,q,vis[100010],deg[100010];
vector <int> g[100010];
pair <int,int> max_deg;
bool sciezka(){
int x = 0;
for(int i = 0; i < n; i++)
if(deg[i] == 1)
x = i;
vector <int> tab;
queue <int> o,z;
tab.push_back(x);
if(s1[x] == '1')
o.push(0);
else
z.push(0);
for(int i = 0; i < n - 1; i++){
x = (!vis[g[x][0]] ? g[x][0] : g[x][1]);
tab.push_back(x);
if(s1[x] == '1')
o.push(i + 1);
else
z.push(i + 1);
}
int val=0,till=-1,last=2;
for(int i = 0; i < tab.size(); i++){
//cout << s1[tab[i]] << " ";
if(i && s2[tab[i-1]] == s2[tab[i]])
continue;
if((till >= i && val != s2[tab[i]]) || (s2[tab[i]] != s1[tab[i]])){
if(val == 0){
while(!o.empty() && o.front() < max(till+1,i))
o.pop();
if(o.empty())
return false;
till = o.front();
}
else{
while(!z.empty() && z.front() < max(till+1,i))
z.pop();
if(z.empty())
return false;
till = z.front();
}
val = !val;
}//cout << till << " " << val << endl;
}
return true;
}
void test_case(){
cin >> n >> s1 >> s2;
bool czy = false;
max_deg = make_pair(0,0);
for(int i = 0; i < n; i++){
if(i && s1[i] != s1[i-1])
czy = true;
deg[i] = vis[i] = 0;
g[i].clear();
}if(!czy){cout << "NIE\n";return;}
for(int i = 0; i < n - 1; i++){
int a,b; cin >> a >> b;
a--,b--;
g[a].push_back(b);
g[b].push_back(a);
deg[a]++; deg[b]++;
if(max_deg.first < deg[a])
max_deg = make_pair(deg[a],a);
if(max_deg.first < deg[b])
max_deg = make_pair(deg[b],b);
}
if(s1 == s2){
cout << "TAK\n";
return;
}
if(max_deg.first <= 2){
if(sciezka() == true)
cout << "TAK\n";
else
cout << "NIE\n";
return;
}
for(int i = 0; i < n; i++){
if(deg[i] > 2){
for(auto j : g[i]){
if(s2[i] != s2[j]){
cout << "TAK\n";
return;
}
}
}
}
cout << "NIE\n";
return;
}
int main(){
ios_base :: sync_with_stdio(0);
cin.tie(0); cout.tie(0);
cin >> q;
while(q--)
test_case();
}
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 | #include <iostream> #include <string> #include <vector> #include <queue> using namespace std; string s1,s2; int n,q,vis[100010],deg[100010]; vector <int> g[100010]; pair <int,int> max_deg; bool sciezka(){ int x = 0; for(int i = 0; i < n; i++) if(deg[i] == 1) x = i; vector <int> tab; queue <int> o,z; tab.push_back(x); if(s1[x] == '1') o.push(0); else z.push(0); for(int i = 0; i < n - 1; i++){ x = (!vis[g[x][0]] ? g[x][0] : g[x][1]); tab.push_back(x); if(s1[x] == '1') o.push(i + 1); else z.push(i + 1); } int val=0,till=-1,last=2; for(int i = 0; i < tab.size(); i++){ //cout << s1[tab[i]] << " "; if(i && s2[tab[i-1]] == s2[tab[i]]) continue; if((till >= i && val != s2[tab[i]]) || (s2[tab[i]] != s1[tab[i]])){ if(val == 0){ while(!o.empty() && o.front() < max(till+1,i)) o.pop(); if(o.empty()) return false; till = o.front(); } else{ while(!z.empty() && z.front() < max(till+1,i)) z.pop(); if(z.empty()) return false; till = z.front(); } val = !val; }//cout << till << " " << val << endl; } return true; } void test_case(){ cin >> n >> s1 >> s2; bool czy = false; max_deg = make_pair(0,0); for(int i = 0; i < n; i++){ if(i && s1[i] != s1[i-1]) czy = true; deg[i] = vis[i] = 0; g[i].clear(); }if(!czy){cout << "NIE\n";return;} for(int i = 0; i < n - 1; i++){ int a,b; cin >> a >> b; a--,b--; g[a].push_back(b); g[b].push_back(a); deg[a]++; deg[b]++; if(max_deg.first < deg[a]) max_deg = make_pair(deg[a],a); if(max_deg.first < deg[b]) max_deg = make_pair(deg[b],b); } if(s1 == s2){ cout << "TAK\n"; return; } if(max_deg.first <= 2){ if(sciezka() == true) cout << "TAK\n"; else cout << "NIE\n"; return; } for(int i = 0; i < n; i++){ if(deg[i] > 2){ for(auto j : g[i]){ if(s2[i] != s2[j]){ cout << "TAK\n"; return; } } } } cout << "NIE\n"; return; } int main(){ ios_base :: sync_with_stdio(0); cin.tie(0); cout.tie(0); cin >> q; while(q--) test_case(); } |
English