#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; } |
English