#include<bits/stdc++.h> #define _ ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0); #define PB push_back using namespace std; int t; int main() { _ cin>>t; while(t--){ int n; cin>>n; vector<int>G[n+2]; int beg[n+2], end[n+2], cntb[2], cnte[2], deg[n+2]; cntb[0]=0, cntb[1]=0, cnte[0]=0, cnte[1]=0; for(int i=0; i<=n; i++){ beg[i]=0; end[i]=0; deg[i]=0; } for(int i=1; i<=n; i++){ char x; cin>>x; if(x=='1'){ beg[i]=1; cntb[1]++; } else{ beg[i]=0; cntb[0]++; } } for(int i=1; i<=n; i++){ char x; cin>>x; if(x=='1'){ end[i]=1; cnte[1]++; } else{ end[i]=0; cnte[0]++; } } for(int a, b, i=1; i<=n-1; i++){ cin>>a>>b; G[a].PB(b); G[b].PB(a); deg[a]++; deg[b]++; } if((cntb[0]==0 && cnte[0]>0) || (cntb[1]==0 && cnte[1]>0)){ cout<<"NIE\n"; continue; } bool ch=1; for(int i=1; i<=n; i++){ if(end[i]!=beg[i]){ ch=0; break; } } if(ch==1){ cout<<"TAK\n"; continue; } bool iff=0, fi=0; for(int i=1; i<=n; i++){ bool zero=0, one=0; for(auto sas: G[i]){ if(end[sas]==0) zero=1; else one=1; } if(G[i].size()>=3 && zero>0 && one>0){ cout<<"TAK\n"; fi=1; break; } } if(fi==1) continue; for(int i=1; i<=n; i++){ for(auto sas: G[i]){ if(end[sas]==end[i]){ iff=1; break; } } if(iff==1) break; } if(iff==0){ cout<<"NIE\n"; continue; } bool stopnie=1; vector<int>para; for(int i=1; i<=n; i++){ if(deg[i]>=3){ stopnie=0; } if(deg[i]==1) para.PB(i); } if(stopnie){ set<int>ch; vector<int>s1, s2; s1.clear(); s2.clear(); int find=para[0]; while(find!=para[1]){ //cout<<find<<" "<<para[0]<<" "<<para[1]<<" "<<G[find][0]<<"\n"; ch.insert(find); if(s1.empty() || s1[s1.size()-1]!=beg[find]) s1.PB(beg[find]); if(s2.empty() || s2[s2.size()-1]!=end[find]) s2.PB(end[find]); if(ch.find(G[find][0])==ch.end()){ ch.insert(G[find][0]); find=G[find][0]; } else{ find=G[find][1]; } } if(s1.empty() || s1[s1.size()-1]!=beg[para[1]]) s1.PB(beg[para[1]]); if(s2.empty() || s2[s2.size()-1]!=end[para[1]]) s2.PB(end[para[1]]); int z=0; bool xx=0; for(int i=0; i<s1.size(); i++){ //cout<<z<<" "<<i<<" "<<s2[z]<<" "<<s1[i]<<"\n"; if(s2[z]==s1[i]) z++; if(z==s2.size()){ xx=1; break; } } if(xx==1){ cout<<"TAK\n"; continue; } else{ cout<<"NIE\n"; continue; } } cout<<"TAK\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 | #include<bits/stdc++.h> #define _ ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0); #define PB push_back using namespace std; int t; int main() { _ cin>>t; while(t--){ int n; cin>>n; vector<int>G[n+2]; int beg[n+2], end[n+2], cntb[2], cnte[2], deg[n+2]; cntb[0]=0, cntb[1]=0, cnte[0]=0, cnte[1]=0; for(int i=0; i<=n; i++){ beg[i]=0; end[i]=0; deg[i]=0; } for(int i=1; i<=n; i++){ char x; cin>>x; if(x=='1'){ beg[i]=1; cntb[1]++; } else{ beg[i]=0; cntb[0]++; } } for(int i=1; i<=n; i++){ char x; cin>>x; if(x=='1'){ end[i]=1; cnte[1]++; } else{ end[i]=0; cnte[0]++; } } for(int a, b, i=1; i<=n-1; i++){ cin>>a>>b; G[a].PB(b); G[b].PB(a); deg[a]++; deg[b]++; } if((cntb[0]==0 && cnte[0]>0) || (cntb[1]==0 && cnte[1]>0)){ cout<<"NIE\n"; continue; } bool ch=1; for(int i=1; i<=n; i++){ if(end[i]!=beg[i]){ ch=0; break; } } if(ch==1){ cout<<"TAK\n"; continue; } bool iff=0, fi=0; for(int i=1; i<=n; i++){ bool zero=0, one=0; for(auto sas: G[i]){ if(end[sas]==0) zero=1; else one=1; } if(G[i].size()>=3 && zero>0 && one>0){ cout<<"TAK\n"; fi=1; break; } } if(fi==1) continue; for(int i=1; i<=n; i++){ for(auto sas: G[i]){ if(end[sas]==end[i]){ iff=1; break; } } if(iff==1) break; } if(iff==0){ cout<<"NIE\n"; continue; } bool stopnie=1; vector<int>para; for(int i=1; i<=n; i++){ if(deg[i]>=3){ stopnie=0; } if(deg[i]==1) para.PB(i); } if(stopnie){ set<int>ch; vector<int>s1, s2; s1.clear(); s2.clear(); int find=para[0]; while(find!=para[1]){ //cout<<find<<" "<<para[0]<<" "<<para[1]<<" "<<G[find][0]<<"\n"; ch.insert(find); if(s1.empty() || s1[s1.size()-1]!=beg[find]) s1.PB(beg[find]); if(s2.empty() || s2[s2.size()-1]!=end[find]) s2.PB(end[find]); if(ch.find(G[find][0])==ch.end()){ ch.insert(G[find][0]); find=G[find][0]; } else{ find=G[find][1]; } } if(s1.empty() || s1[s1.size()-1]!=beg[para[1]]) s1.PB(beg[para[1]]); if(s2.empty() || s2[s2.size()-1]!=end[para[1]]) s2.PB(end[para[1]]); int z=0; bool xx=0; for(int i=0; i<s1.size(); i++){ //cout<<z<<" "<<i<<" "<<s2[z]<<" "<<s1[i]<<"\n"; if(s2[z]==s1[i]) z++; if(z==s2.size()){ xx=1; break; } } if(xx==1){ cout<<"TAK\n"; continue; } else{ cout<<"NIE\n"; continue; } } cout<<"TAK\n"; } } |