#include <bits/stdc++.h> using namespace std; vector<int>D[100009]; int main() { ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0); int q; cin>>q; for(int I=1;I<=q;I++) { int n; string A,B; cin>>n; cin>>A>>B; for(int i=1;i<=n;i++){D[i].clear();} for(int i=1;i<n;i++) { int a,b; cin>>a>>b; D[a].push_back(b); D[b].push_back(a); } if(A==B){cout<<"TAK"<<endl;continue;} if(n==1){cout<<"NIE"<<endl;continue;} char sygnal=A[0]; for(int i=1;i<A.size();i++) { if(A[i]!=sygnal) { sygnal='@'; break; } } if(sygnal!='@'){cout<<"NIE"<<endl;continue;} vector<int>liscie; for(int i=1;i<=n;i++) { if(D[i].size()==1){liscie.push_back(i);} } if(liscie.size()!=2) { bool cv=0; for(int i=1;i<=n;i++) { for(int j=0;j<D[i].size();j++) { if(B[i-1]==B[D[i][j]-1]) { cv=1; break; } } if(cv==1){break;} } if(cv==0){cout<<"NIE"<<endl;} else{cout<<"TAK"<<endl;} continue; } string AA,BB; int v=liscie[0]; int poprzedni=-1; while(true) { AA.push_back(A[v-1]); BB.push_back(B[v-1]); if(v==liscie[1]){break;} if(D[v][0]!=poprzedni) { poprzedni=v; v=D[v][0]; } else { poprzedni=v; v=D[v][1]; } } while(BB.size()>0) { while(AA.size()>0&&AA[AA.size()-1]!=BB[BB.size()-1]) { AA.pop_back(); } if(AA.size()==0){break;} while(BB.size()>0&&BB[BB.size()-1]==AA[AA.size()-1]) { BB.pop_back(); } AA.pop_back(); } if(BB.size()==0){cout<<"TAK"<<endl;} else{cout<<"NIE"<<endl;} } 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 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 | #include <bits/stdc++.h> using namespace std; vector<int>D[100009]; int main() { ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0); int q; cin>>q; for(int I=1;I<=q;I++) { int n; string A,B; cin>>n; cin>>A>>B; for(int i=1;i<=n;i++){D[i].clear();} for(int i=1;i<n;i++) { int a,b; cin>>a>>b; D[a].push_back(b); D[b].push_back(a); } if(A==B){cout<<"TAK"<<endl;continue;} if(n==1){cout<<"NIE"<<endl;continue;} char sygnal=A[0]; for(int i=1;i<A.size();i++) { if(A[i]!=sygnal) { sygnal='@'; break; } } if(sygnal!='@'){cout<<"NIE"<<endl;continue;} vector<int>liscie; for(int i=1;i<=n;i++) { if(D[i].size()==1){liscie.push_back(i);} } if(liscie.size()!=2) { bool cv=0; for(int i=1;i<=n;i++) { for(int j=0;j<D[i].size();j++) { if(B[i-1]==B[D[i][j]-1]) { cv=1; break; } } if(cv==1){break;} } if(cv==0){cout<<"NIE"<<endl;} else{cout<<"TAK"<<endl;} continue; } string AA,BB; int v=liscie[0]; int poprzedni=-1; while(true) { AA.push_back(A[v-1]); BB.push_back(B[v-1]); if(v==liscie[1]){break;} if(D[v][0]!=poprzedni) { poprzedni=v; v=D[v][0]; } else { poprzedni=v; v=D[v][1]; } } while(BB.size()>0) { while(AA.size()>0&&AA[AA.size()-1]!=BB[BB.size()-1]) { AA.pop_back(); } if(AA.size()==0){break;} while(BB.size()>0&&BB[BB.size()-1]==AA[AA.size()-1]) { BB.pop_back(); } AA.pop_back(); } if(BB.size()==0){cout<<"TAK"<<endl;} else{cout<<"NIE"<<endl;} } return 0; } |