#include <iostream> #include <fstream> #include <vector> #include <algorithm> #include <unordered_set> using namespace std; int n; struct link_t { int a; int b; }; vector<link_t> links; typedef unsigned int long long ull; ull initial_state=0; ull target_state=0; unordered_set<ull> s; ull invert_bit(ull v,int index) { ull mask=((ull)1<<index); ull res=(v&mask)?(v&(~mask)):(v|mask); return res; } bool visit(ull state) { { auto it=s.find(state); if(it!=s.end()) return false; } if (state == target_state) return true; s.insert(state); for(int i=0;i<n-1;++i) { const bool is_a_set=(state&((ull)1<<links[i].a))!=0; const bool is_b_set=(state&((ull)1<<links[i].b))!=0; if(is_a_set!=is_b_set) { if(visit(invert_bit(state,links[i].a))) return true; if(visit(invert_bit(state,links[i].b))) return true; } } return false; } bool solve() { s.clear(); return visit(initial_state); } int main() { #ifdef _DEBUG ifstream input("input0.txt"); #else #define input cin #endif string s1,s2; int t; input>>t; for(int i=0;i<t;++i) { input>>n>>s1>>s2; initial_state=target_state=0; for(int j=0;j<n;++j) { if(s1[j]=='1') initial_state|=((ull)1<<j); if(s2[j]=='1') target_state|=((ull)1<<j); } links.resize(n-1); for(int j=0;j<n-1;++j) { int a,b; input>>a>>b; --a; --b; links[j]={a,b}; } bool result=solve(); cout<<(result?"TAK":"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 95 96 97 98 99 | #include <iostream> #include <fstream> #include <vector> #include <algorithm> #include <unordered_set> using namespace std; int n; struct link_t { int a; int b; }; vector<link_t> links; typedef unsigned int long long ull; ull initial_state=0; ull target_state=0; unordered_set<ull> s; ull invert_bit(ull v,int index) { ull mask=((ull)1<<index); ull res=(v&mask)?(v&(~mask)):(v|mask); return res; } bool visit(ull state) { { auto it=s.find(state); if(it!=s.end()) return false; } if (state == target_state) return true; s.insert(state); for(int i=0;i<n-1;++i) { const bool is_a_set=(state&((ull)1<<links[i].a))!=0; const bool is_b_set=(state&((ull)1<<links[i].b))!=0; if(is_a_set!=is_b_set) { if(visit(invert_bit(state,links[i].a))) return true; if(visit(invert_bit(state,links[i].b))) return true; } } return false; } bool solve() { s.clear(); return visit(initial_state); } int main() { #ifdef _DEBUG ifstream input("input0.txt"); #else #define input cin #endif string s1,s2; int t; input>>t; for(int i=0;i<t;++i) { input>>n>>s1>>s2; initial_state=target_state=0; for(int j=0;j<n;++j) { if(s1[j]=='1') initial_state|=((ull)1<<j); if(s2[j]=='1') target_state|=((ull)1<<j); } links.resize(n-1); for(int j=0;j<n-1;++j) { int a,b; input>>a>>b; --a; --b; links[j]={a,b}; } bool result=solve(); cout<<(result?"TAK":"NIE")<<endl; } return 0; } |