#include <iostream> #include <vector> // #include <algorithm> #include <array> //#include <map> #include <math.h> #include <map> // #include <bits/stdc++.h> using namespace std; string litery = "abcdefghijklmnopqrstuvwxyz"; map<char, int> jedenki_w_literze; // ile jedynak ma dana litera array<string, 10> wybrane_litery; // na pozycji n-tej jest litera ktora ma n jedynek string liczba_binarna = ""; int ile_jedynek = 0; long suma = 0; long n; void print_a(string txt, array<string, 10> tab) { cout << txt << " "; for (int i = 0; i < tab.size(); ++i) { cout << i << "=" << tab[i] << " "; } cout << "\n"; } string binarnie(int liczba, int potega) { if (potega < 1) return liczba_binarna; int x = pow(2, potega); // cout << "liczba:" << liczba << " potega:" << potega << " x:" << x << " potega -1:" << pow(2, potega - 1) << "\n"; if (liczba > x) { cout << "cos nie tak !!!"; return "cos nie tak - za mala podstawa"; } else { x = pow(2, potega - 1); if (x > liczba) { liczba_binarna = liczba_binarna + "0"; return binarnie(liczba, potega - 1); cout << "0\n"; } else { liczba_binarna = liczba_binarna + "1"; ile_jedynek++; return binarnie(liczba - x, potega - 1); cout << "1\n"; } } } int suma_slowa(string slowo) { int wynik = 0; for (int i; i < slowo.size(); i++) wynik += jedenki_w_literze[slowo[i]]; return wynik; } /* globalne: suma wybrane_litery 3...6 */ string ch; long iteracji = 0; // bool znaleziono = false; long akt_suma; string znajdz_slowo(int n1, int cnt) { iteracji++; // if (znaleziono) return "!"; // cout << "n1: " << n1 << " cnt:" << cnt << " suma: " << suma << " iteracji: " << iteracji << "\n"; // if (n == 0) { // if (suma == cnt) { // znaleziono = true; // return ""; // } // return "!"; // } // if (cnt > suma) return "!"; for (int i = 3; i <= 6; i++) { // cout << "i: " << i << " " << wybrane_litery[i] << "\n"; akt_suma = cnt + i; if (akt_suma + n1 * 3 > suma) { // nie uda sie dojść // cout << "nie uda sie dojsc!!!"; // cout << "akt_suma: " << akt_suma << " akt_suma + (n + 1) * 3: " << akt_suma + (n1 + 1) * 3 << "\n"; return "!"; // tu nie musi byc continue gdyz od 3 zaczynamy } if (akt_suma + n1 * 6 < suma) { // nie uda sie dojść //cout << "nie uda sie dojsc 2222!!!"; // cout << "akt_suma: " << akt_suma << " (akt_suma + n1 * 6: " << akt_suma + n1 * 6 << "\n"; continue; } if (akt_suma == suma) { if (n1 == 0) { return wybrane_litery[i]; } else { return "!"; } } else if (n1 > 0 && akt_suma < suma - 2) { ch = znajdz_slowo(n1 - 1, cnt + i); if (ch != "!") return wybrane_litery[i] + ch; } } return "!"; } int main() { cin >> n; string slowo; cin >> slowo; // long wynik = 0; for (int i; i < n * 8; i++) if (slowo[i] == '1') suma++; for (int i; i < wybrane_litery.size(); i++) wybrane_litery[i] = ""; for (int i; i < litery.size(); i++) { liczba_binarna = ""; ile_jedynek = 0; binarnie(97 + i, 8); // cout << "litera:" << litery[i] << " bin:" << liczba_binarna << " jedynek:" << ile_jedynek << "\n"; jedenki_w_literze[litery[i]] = ile_jedynek; if (wybrane_litery[ile_jedynek] == "" ) wybrane_litery[ile_jedynek] = litery[i]; } // cout << "bin:" << binarnie(97, 8) << "\n"; // cout << "ilosc_marek:" << ilosc_marek << "\n"; // ok = ok1 + ok2 + ok3 + ok4; // print_a("wybrane litery: ", wybrane_litery); // cout << "\n"; // cout << "\n"; // cout << "ile jedynek:" << suma_slowa("amonadisjustamonoidinthecategoryofendofunctorswhatstheproblem") << "\n"; string wynik = znajdz_slowo(n - 1, 0); if (wynik == "!") wynik = "NIE"; //cout << "n:" << n << " slowo: " << slowo << " suma: " << suma << "\n"; cout << wynik << "\n"; //cout << "sprawdzam wynik:" << suma_slowa(wynik) << "\n"; //cout << "iteracji:" << iteracji << "\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 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 | #include <iostream> #include <vector> // #include <algorithm> #include <array> //#include <map> #include <math.h> #include <map> // #include <bits/stdc++.h> using namespace std; string litery = "abcdefghijklmnopqrstuvwxyz"; map<char, int> jedenki_w_literze; // ile jedynak ma dana litera array<string, 10> wybrane_litery; // na pozycji n-tej jest litera ktora ma n jedynek string liczba_binarna = ""; int ile_jedynek = 0; long suma = 0; long n; void print_a(string txt, array<string, 10> tab) { cout << txt << " "; for (int i = 0; i < tab.size(); ++i) { cout << i << "=" << tab[i] << " "; } cout << "\n"; } string binarnie(int liczba, int potega) { if (potega < 1) return liczba_binarna; int x = pow(2, potega); // cout << "liczba:" << liczba << " potega:" << potega << " x:" << x << " potega -1:" << pow(2, potega - 1) << "\n"; if (liczba > x) { cout << "cos nie tak !!!"; return "cos nie tak - za mala podstawa"; } else { x = pow(2, potega - 1); if (x > liczba) { liczba_binarna = liczba_binarna + "0"; return binarnie(liczba, potega - 1); cout << "0\n"; } else { liczba_binarna = liczba_binarna + "1"; ile_jedynek++; return binarnie(liczba - x, potega - 1); cout << "1\n"; } } } int suma_slowa(string slowo) { int wynik = 0; for (int i; i < slowo.size(); i++) wynik += jedenki_w_literze[slowo[i]]; return wynik; } /* globalne: suma wybrane_litery 3...6 */ string ch; long iteracji = 0; // bool znaleziono = false; long akt_suma; string znajdz_slowo(int n1, int cnt) { iteracji++; // if (znaleziono) return "!"; // cout << "n1: " << n1 << " cnt:" << cnt << " suma: " << suma << " iteracji: " << iteracji << "\n"; // if (n == 0) { // if (suma == cnt) { // znaleziono = true; // return ""; // } // return "!"; // } // if (cnt > suma) return "!"; for (int i = 3; i <= 6; i++) { // cout << "i: " << i << " " << wybrane_litery[i] << "\n"; akt_suma = cnt + i; if (akt_suma + n1 * 3 > suma) { // nie uda sie dojść // cout << "nie uda sie dojsc!!!"; // cout << "akt_suma: " << akt_suma << " akt_suma + (n + 1) * 3: " << akt_suma + (n1 + 1) * 3 << "\n"; return "!"; // tu nie musi byc continue gdyz od 3 zaczynamy } if (akt_suma + n1 * 6 < suma) { // nie uda sie dojść //cout << "nie uda sie dojsc 2222!!!"; // cout << "akt_suma: " << akt_suma << " (akt_suma + n1 * 6: " << akt_suma + n1 * 6 << "\n"; continue; } if (akt_suma == suma) { if (n1 == 0) { return wybrane_litery[i]; } else { return "!"; } } else if (n1 > 0 && akt_suma < suma - 2) { ch = znajdz_slowo(n1 - 1, cnt + i); if (ch != "!") return wybrane_litery[i] + ch; } } return "!"; } int main() { cin >> n; string slowo; cin >> slowo; // long wynik = 0; for (int i; i < n * 8; i++) if (slowo[i] == '1') suma++; for (int i; i < wybrane_litery.size(); i++) wybrane_litery[i] = ""; for (int i; i < litery.size(); i++) { liczba_binarna = ""; ile_jedynek = 0; binarnie(97 + i, 8); // cout << "litera:" << litery[i] << " bin:" << liczba_binarna << " jedynek:" << ile_jedynek << "\n"; jedenki_w_literze[litery[i]] = ile_jedynek; if (wybrane_litery[ile_jedynek] == "" ) wybrane_litery[ile_jedynek] = litery[i]; } // cout << "bin:" << binarnie(97, 8) << "\n"; // cout << "ilosc_marek:" << ilosc_marek << "\n"; // ok = ok1 + ok2 + ok3 + ok4; // print_a("wybrane litery: ", wybrane_litery); // cout << "\n"; // cout << "\n"; // cout << "ile jedynek:" << suma_slowa("amonadisjustamonoidinthecategoryofendofunctorswhatstheproblem") << "\n"; string wynik = znajdz_slowo(n - 1, 0); if (wynik == "!") wynik = "NIE"; //cout << "n:" << n << " slowo: " << slowo << " suma: " << suma << "\n"; cout << wynik << "\n"; //cout << "sprawdzam wynik:" << suma_slowa(wynik) << "\n"; //cout << "iteracji:" << iteracji << "\n"; } |