Niestety, nie byliśmy w stanie w pełni poprawnie wyświetlić tego pliku, ponieważ nie jest zakodowany w UTF-8.
Możesz pobrać ten plik i spróbować otworzyć go samodzielnie.
#include <iostream> #include <vector> using namespace std; vector<int> tab[100007]; char kol(string s) { // zwraca kolor kt�rego s nie zawiera je�li jednokolorowe, wpp 0 for (int i = 1; i < s.length(); i++) { if (s[i] != s[i - 1]) return 0; } if (s[0] == '1') return '0'; return '1'; } bool zawiera(string s, char c) { for (int i = 0; i < s.length(); i++) { if (s[i] == c) return true; } return false; } int dfs(int v, int ojc, const string& s) { int wyn = 1; for (int i = 0; i < tab[v].size(); i++) { int u = tab[v][i]; if (u != ojc) { wyn += dfs(u, v, s); if (s[u - 1] == s[v - 1]) wyn--; } } //cerr<<"v = "<<v<<" wyn = "<<wyn<<endl; return wyn; } int main() { int t; cin>>t; //cerr<<"t = "<<t<<endl; for (int l = 0; l < t; l++) { int n; cin>>n; //cerr<<"n = "<<n<<endl; string s1, s2; cin>>s1>>s2; //cerr<<"s1 = "<<s1<<"\ns2 = "<<s2<<endl; for (int i = 1; i <= n; i++) { tab[i].clear(); } int maxdeg = 0; for (int i = 1; i < n; i++) { int a, b; cin>>a>>b; //cerr<<"a = "<<a<<" b = "<<b<<endl; tab[a].push_back(b); tab[b].push_back(a); maxdeg = max(maxdeg, (int)tab[a].size()); maxdeg = max(maxdeg, (int)tab[b].size()); //cerr<<"maxdeg = "<<maxdeg<<" "<<tab[a].size()<<" "<<tab[b].size()<<endl; } /* cout<<"wypisuje graf n = "<<n<<endl; for (int i = 1; i <= n; i++) { cout<<i<<": "; for (int j = 0; j < tab[i].size(); j++) { cout<<tab[i][j]<<" "; } cout<<endl; }*/ if (zawiera(s2, kol(s1))) { // je�li s1 jednokolorowe i s2 zawiera kolor niewyst�puj�cy w s1 //cerr<<"jedkokolorowe\n"; cout<<"NIE\n"; } else { if (maxdeg == 0) { if (s1 == s2) cout<<"TAK\n"; else cout<<"NIE\n"; } else if (maxdeg <= 2) { // sciezka //cerr<<"sciezka\n"; int pocz = -1; for (int i = 1; i <= n; i++) { if (tab[i].size() == 1) { pocz = i; break; } } string p1, p2; // pocz�tkowa i ko�cowa konfiguracja �cie�ki // p2 musi wyst�powa� w p1 jako substring int pop = pocz; int v = tab[pocz][0]; //cerr<<pop<<" -> "<<v; p1 += s1[pop - 1]; p2 += s2[pop - 1]; if (s1[pop - 1] != s1[v - 1]) p1 += s1[v - 1]; if (s2[pop - 1] != s2[v - 1]) p2 += s2[v - 1]; while (tab[v].size() > 1) { int u = tab[v][0] == pop ? tab[v][1] : tab[v][0]; pop = v; v = u; if (s1[pop - 1] != s1[v - 1]) p1 += s1[v - 1]; if (s2[pop - 1] != s2[v - 1]) p2 += s2[v - 1]; //cerr<<" -> "<<v; } //cerr<<endl; //cerr<<"p1 = "<<p1<<"\np2 = "<<p2<<"\n"; if (p2.length() <= p1.length() && p1.find(p2) < p1.length()) cout<<"TAK\n"; else cout<<"NIE\n"; } else { 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 121 122 123 124 125 126 127 | #include <iostream> #include <vector> using namespace std; vector<int> tab[100007]; char kol(string s) { // zwraca kolor kt�rego s nie zawiera je�li jednokolorowe, wpp 0 for (int i = 1; i < s.length(); i++) { if (s[i] != s[i - 1]) return 0; } if (s[0] == '1') return '0'; return '1'; } bool zawiera(string s, char c) { for (int i = 0; i < s.length(); i++) { if (s[i] == c) return true; } return false; } int dfs(int v, int ojc, const string& s) { int wyn = 1; for (int i = 0; i < tab[v].size(); i++) { int u = tab[v][i]; if (u != ojc) { wyn += dfs(u, v, s); if (s[u - 1] == s[v - 1]) wyn--; } } //cerr<<"v = "<<v<<" wyn = "<<wyn<<endl; return wyn; } int main() { int t; cin>>t; //cerr<<"t = "<<t<<endl; for (int l = 0; l < t; l++) { int n; cin>>n; //cerr<<"n = "<<n<<endl; string s1, s2; cin>>s1>>s2; //cerr<<"s1 = "<<s1<<"\ns2 = "<<s2<<endl; for (int i = 1; i <= n; i++) { tab[i].clear(); } int maxdeg = 0; for (int i = 1; i < n; i++) { int a, b; cin>>a>>b; //cerr<<"a = "<<a<<" b = "<<b<<endl; tab[a].push_back(b); tab[b].push_back(a); maxdeg = max(maxdeg, (int)tab[a].size()); maxdeg = max(maxdeg, (int)tab[b].size()); //cerr<<"maxdeg = "<<maxdeg<<" "<<tab[a].size()<<" "<<tab[b].size()<<endl; } /* cout<<"wypisuje graf n = "<<n<<endl; for (int i = 1; i <= n; i++) { cout<<i<<": "; for (int j = 0; j < tab[i].size(); j++) { cout<<tab[i][j]<<" "; } cout<<endl; }*/ if (zawiera(s2, kol(s1))) { // je�li s1 jednokolorowe i s2 zawiera kolor niewyst�puj�cy w s1 //cerr<<"jedkokolorowe\n"; cout<<"NIE\n"; } else { if (maxdeg == 0) { if (s1 == s2) cout<<"TAK\n"; else cout<<"NIE\n"; } else if (maxdeg <= 2) { // sciezka //cerr<<"sciezka\n"; int pocz = -1; for (int i = 1; i <= n; i++) { if (tab[i].size() == 1) { pocz = i; break; } } string p1, p2; // pocz�tkowa i ko�cowa konfiguracja �cie�ki // p2 musi wyst�powa� w p1 jako substring int pop = pocz; int v = tab[pocz][0]; //cerr<<pop<<" -> "<<v; p1 += s1[pop - 1]; p2 += s2[pop - 1]; if (s1[pop - 1] != s1[v - 1]) p1 += s1[v - 1]; if (s2[pop - 1] != s2[v - 1]) p2 += s2[v - 1]; while (tab[v].size() > 1) { int u = tab[v][0] == pop ? tab[v][1] : tab[v][0]; pop = v; v = u; if (s1[pop - 1] != s1[v - 1]) p1 += s1[v - 1]; if (s2[pop - 1] != s2[v - 1]) p2 += s2[v - 1]; //cerr<<" -> "<<v; } //cerr<<endl; //cerr<<"p1 = "<<p1<<"\np2 = "<<p2<<"\n"; if (p2.length() <= p1.length() && p1.find(p2) < p1.length()) cout<<"TAK\n"; else cout<<"NIE\n"; } else { cout<<"TAK\n"; } } } } |