// {{{ #include <bits/stdc++.h> #include <ext/pb_ds/assoc_container.hpp> #include <ext/pb_ds/tree_policy.hpp> #define FOR(i, b, e) for (int i = (b); i <= (e); i++) #define FORD(i, b, e) for (int i = (e); i >= (b); i--) #define MP make_pair #define FS first #define ND second #define PB push_back #define ALL(x) x.begin(), x.end() using namespace std; using LL = long long; using LD = long double; using PII = pair<int,int>; using PLL = pair<LL,LL>; using PLD = pair<LD,LD>; using VI = vector<int>; using VLL = vector<LL>; using VLD = vector<LD>; using VB = vector<bool>; using VS = vector<string>; template<class T> using V = vector<T>; template<class T1, class T2> using P = pair<T1,T2>; template<class T,class Comp=greater<T>> using PQ = priority_queue<T,V<T>,Comp>; template<class T> int sz(const T& a) { return (int)a.size(); } template<class T> void amin(T& a, T b) { a = min(a, b); } template<class T> void amax(T& a, T b) { a = max(a, b); } /* const size_t rseed = std::chrono::high_resolution_clock::now().time_since_epoch().count(); mt19937 rnd(rseed); template<class T> T randint(T lo, T hi) { return uniform_int_distribution<T>{lo,hi}(rnd); } */ /* find_by_order(k) - k'th largest counting from 0; order_of_key(k) - number of items strictly smaller than k; join(other), split(k, other) - all keys in other greater than in *(this). */ template<class K,class V,class Comp=less<K>> using ordered_map = __gnu_pbds::tree<K,V,Comp, __gnu_pbds::rb_tree_tag,__gnu_pbds::tree_order_statistics_node_update>; template<class T,class Comp=less<T>> using ordered_set = ordered_map<T,__gnu_pbds::null_type,Comp>; const int inf = 1e9 + 1; const LL infl = 1e18 + 1; void solve(); // }}} int main() { int t = 1; // scanf("%d", &t); FOR(i, 1, t) { // printf("Case #%d: ", i); solve(); } } const int N = 1e5; int n, cnt[2]; char s[8 * N + 2]; int by[N + 1]; char ascii[9]; void solve() { scanf("%d %s", &n, &s[1]); FOR(i, 1, 8 * n) cnt[s[i] - '0']++; FOR(x, 'a', 'z') ascii[__builtin_popcount(x)] = x; int minbits = inf; int maxbits = -inf; FOR(i, 0, 8) if (ascii[i]) { amin(minbits, i); amax(maxbits, i); } while (cnt[1]) { FOR(i, 1, n) { if (cnt[1]) { by[i]++; cnt[1]--; } } } FOR(i, 1, n) { if (by[i] < minbits || by[i] > maxbits) { puts("NIE"); return; } } FOR(i, 1, n) printf("%c", ascii[by[i]]); putchar('\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 | // {{{ #include <bits/stdc++.h> #include <ext/pb_ds/assoc_container.hpp> #include <ext/pb_ds/tree_policy.hpp> #define FOR(i, b, e) for (int i = (b); i <= (e); i++) #define FORD(i, b, e) for (int i = (e); i >= (b); i--) #define MP make_pair #define FS first #define ND second #define PB push_back #define ALL(x) x.begin(), x.end() using namespace std; using LL = long long; using LD = long double; using PII = pair<int,int>; using PLL = pair<LL,LL>; using PLD = pair<LD,LD>; using VI = vector<int>; using VLL = vector<LL>; using VLD = vector<LD>; using VB = vector<bool>; using VS = vector<string>; template<class T> using V = vector<T>; template<class T1, class T2> using P = pair<T1,T2>; template<class T,class Comp=greater<T>> using PQ = priority_queue<T,V<T>,Comp>; template<class T> int sz(const T& a) { return (int)a.size(); } template<class T> void amin(T& a, T b) { a = min(a, b); } template<class T> void amax(T& a, T b) { a = max(a, b); } /* const size_t rseed = std::chrono::high_resolution_clock::now().time_since_epoch().count(); mt19937 rnd(rseed); template<class T> T randint(T lo, T hi) { return uniform_int_distribution<T>{lo,hi}(rnd); } */ /* find_by_order(k) - k'th largest counting from 0; order_of_key(k) - number of items strictly smaller than k; join(other), split(k, other) - all keys in other greater than in *(this). */ template<class K,class V,class Comp=less<K>> using ordered_map = __gnu_pbds::tree<K,V,Comp, __gnu_pbds::rb_tree_tag,__gnu_pbds::tree_order_statistics_node_update>; template<class T,class Comp=less<T>> using ordered_set = ordered_map<T,__gnu_pbds::null_type,Comp>; const int inf = 1e9 + 1; const LL infl = 1e18 + 1; void solve(); // }}} int main() { int t = 1; // scanf("%d", &t); FOR(i, 1, t) { // printf("Case #%d: ", i); solve(); } } const int N = 1e5; int n, cnt[2]; char s[8 * N + 2]; int by[N + 1]; char ascii[9]; void solve() { scanf("%d %s", &n, &s[1]); FOR(i, 1, 8 * n) cnt[s[i] - '0']++; FOR(x, 'a', 'z') ascii[__builtin_popcount(x)] = x; int minbits = inf; int maxbits = -inf; FOR(i, 0, 8) if (ascii[i]) { amin(minbits, i); amax(maxbits, i); } while (cnt[1]) { FOR(i, 1, n) { if (cnt[1]) { by[i]++; cnt[1]--; } } } FOR(i, 1, n) { if (by[i] < minbits || by[i] > maxbits) { puts("NIE"); return; } } FOR(i, 1, n) printf("%c", ascii[by[i]]); putchar('\n'); } |