#pragma region header #include using namespace std; /* alias */ using ull = unsigned long long; using ll = long long; using vi = vector; using vl = vector; using vll = vector; using vf = vector; using vd = vector; using vdd = vector; using vvf = vector; using vvi = vector; using vvl = vector; using vvll = vector; using vs = vector; using vvs = vector; using vc = vector; using vb = vector; using vvb = vector; using vvc = vector; using pll = pair; using vpll = vector; using qll = queue; typedef complex cd; //仮想配列map<> https://code-database.com/knowledges/100 //優先度付きque https://atcoder.jp/contests/apg4b/tasks/APG4b_aa /* define short */ #define MOD 1000000007 #define INF LLONG_MAX/32 #define elif else if #define pb push_back #define pf push_front #define fi first #define se second #define mp make_pair #define all(obj) (obj).begin(), (obj).end() #define YESNO(bool) if(bool){cout<<"YES"<bool chmax(T &a, const T &b) { if (abool chmin(T &a, const T &b) { if (b=0;i--) #define rrepd(i,n) for(ll i=n;i>=1;i--) //小数点以下出力の時にmainに書く // cout << fixed << setprecision(10); #define debug(x) cerr << #x << ":" << x << endl; #pragma endregion header ll N; vvll Graph;/*グラフ*/ ll H, W; vs HW;/*HW .#*/ struct edge{ll to, cost;}; vector> G; #pragma region fanction #pragma region First Search /*幅優先探索 vll dist(N,-1); Graphは隣接リスト*/ void bfs(vll &dist, ll fq, vvll Graph){ dist[fq] = 0; deque que;que.pb(fq); ll v; while(!que.empty()){ v = que.front();que.pop_front(); for(ll nv:Graph[v]){ if(dist[nv] != -1) continue; dist[nv] = dist[v] + 1; que.pb(nv); } } } /*distにsysxからの距離が入る 各重み1*/ /*HW幅優先探索 https://pyteyon.hatenablog.com/entry/2019/03/01/211133#%E6%B7%B1%E3%81%95%E5%84%AA%E5%85%88%E6%8E%A2%E7%B4%A2*/ /*vvll dist(H vll(W)); rep(h,H) rep(w,W) dist[h][w] = INF;*/ void HW_bfs(vvll &dist, ll sy, ll sx, vs HW){ dist[sy][sx] = 0; deque que; que.pb({sy,sx}); vll v; ll nowy, nowx, nexty,nextx; vvll dydx = {{1,0},{0,1},{-1,0},{0,-1}}; //重み1ならpbしてd++ 重み0ならpfしてそのままdiseにd入れれば01bfs //que.back();que.pop_back()で深さ優先探索 while(!que.empty()){ v = que.front();que.pop_front(); nowy = v[0]; nowx = v[1]; for(vll dyx:dydx){ nexty = nowy+dyx[0]; nextx = nowx+dyx[1]; if(!(0 <= nexty && nexty < H && 0 <= nextx && nextx < W)) continue; if(HW[nexty][nextx] == 'o' && dist[nexty][nextx] == INF){ que.pb({nexty,nextx}); dist[nexty][nextx] = dist[nowy][nowx] + 1; } } } } /*深さ優先探索 vll dist(N,-1); Graphは隣接リスト スタートのdistを0にすること!*/ void dfs(vll &dist, ll v, vvll &Graph){ for(ll nv:Graph[v]){ if(dist[nv] != -1) continue; dist[nv] = dist[v] + 1; dfs(dist,nv,Graph); } } //単一始点最短経路 ダイクストラ O(MlogN) //vector> G //G; fi:to se:cost // Graph.resize(N); // rep(i,M){ // ll a,b,c; cin >> a >> b >> c; // a--;b--; // Graph[a].pb(pll(b,c)); // Graph[b].pb(pll(a,c)); // } //Gで呼べばOK vll dijkstra(ll start,vector> &G){ vll dist(N,INF); priority_queue,greater> que; dist[start] = 0; que.push(pll(dist[start],start)); while (!que.empty()){ pll p = que.top(); que.pop(); ll v = p.second; if(dist[v] < p.first) continue; for(auto &e:G[v]){ if(dist[e.to] > dist[v] + e.cost){ dist[e.to] = dist[v] + e.cost; que.push(pll(dist[e.to],e.to)); } } } return dist; } /*analyze*/ struct Gr{ bool ki; ll sz; ll parent;}; void analyzedfs(vb &vis, ll now, ll bef, Gr &add,bool &t, vvll &Graph){ add.sz++; for(auto nxt:Graph[now]) if(nxt != bef){ if(nxt == now) t = true; if(vis[nxt]){ add.ki = false; }else{ vis[nxt] = true; analyzedfs(vis,nxt,now,add,t,Graph); } } } // /*Graphの中の複数のグラフを分解、サイズと親の番号を返す*/ vector analyze(vvll &Graph){ /*Grはbool ki, ll sz,parentからなる kiは木かどうかをtrue,falseで返す*/ /*szはサイズ parentはそのグラフの中で一番小さい頂点*/ vector ret; vb vis(Graph.size(),false); rep(i,Graph.size()){ if(vis[i]) continue; vis[i] = true; Gr add = {true,0,i}; bool t = false;//自己ループ単体は0,1として返す analyzedfs(vis,i,-1,add,t,Graph); if(add.sz > 1) ret.pb(add); elif(t) ret.pb({0,1}); } return ret; } #pragma endregion First Search #pragma region MOD const ll nCkMax = 1e6; vll fac(1,0),finv(1,0),inv(1,0); void COMinit(){ fac.resize(nCkMax); finv.resize(nCkMax); inv.resize(nCkMax); fac[0] = fac[1] = 1; finv[0] = finv[1] = 1; inv[1] = 1; for(ll i=2;i 0) { if (n & 1) res = res * a % MOD; a = a * a % MOD; n >>= 1; } return res; } /*a! mod p O(N)*/ ll modfac(ll n){ ll ret = 1; rrep(i,n){ ret *= i; ret %= MOD; } return ret; } /*nCk % mod 前処理O(N) クエリ処理O(1)*/ ll nCk(ll n, ll k){ if(fac[0] != 1) COMinit();//初期化 O(N) if(n &A){ std::map mem; for(auto p: A) mem[p] = 0; ll sz = 0; for(auto &p: mem) p.second = sz++; for(auto &p: A) p = mem[p]; return sz; } /*string Sに何個string Kが含まれるか 一文字でもいいけどcharじゃなくてstringにしてね*/ ll stringinstring(string &S,string K){ ll ret = 0; rep(i,S.size()-K.size()+1){ bool f = true; rep(j,K.size()) if(S[i+j] != K[j]) f=false; if(f) ret++; } return ret; } #pragma endregion array #pragma region frac struct frac{ ll c, m; //child, mother c/m void simplify(){ ll g = gcd(c, m); c /= g; m /= g; return; } frac operator+(frac &x){ frac res(*this); res = {res.c * x.m + x.c * res.m, res.m * x.m}; return res; } frac operator-(frac &x){ frac res(*this); res = {res.c * x.m - x.c * res.m, res.m * x.m}; return res; } frac operator/(frac &x){ frac res(*this); res = {res.c * x.m, res.m * x.c}; return res; } frac operator*(frac &x){ frac res(*this); res = {res.c * x.c, res.m * x.m}; return res; } bool operator==(frac &x){ return (c * x.m == m * x.c);} bool operator>(frac &x){ return (c * x.m > m * x.c);} bool operator>=(frac &x){ return (c * x.m >= m * x.c);} bool operator<(frac &x){ return (c * x.m < m * x.c);} bool operator<=(frac &x){ return (c * x.m <= m * x.c);} }; #pragma endregion UnionFind #pragma region bisect /*二分探索*/ ll bisect_left(vll &array, ll key){ return lower_bound(all(array),key) - array.begin(); } ll bisect_right(vll &array, ll key){ return upper_bound(all(array),key) - array.begin(); } /*最長増加部分列 dpがright:i 1){ mid = (ok + ng) / 2; if(solve(mid)) ok = mid; else ng = mid; } return ok; } #pragma endregion bisect #pragma region others /* memo 二次元配列の90度回転 // i:j // j:N - i - 1 */ /*普通のa^n*/ ll mpow(ll a, ll n){ if(n==0) return 1; ll res = 1; while (n > 0) { if (n & 1) res *= a; a *= a; n >>= 1; } return res; } /*最大公約数*/ ll gcd(ll x,ll y){ if (x < y) swap(x,y); while (y > 0){ ll r = x % y; x = y; y = r; } return x; } /*最小公倍数*/ ll lcm(ll x,ll y){ return x * y / (gcd(x,y)); } /*約数列挙*/ vll divisor(ll n){ vll ret; for (ll i = 1; i * i <= n; i++){ if (n % i == 0){ ret.pb(i); if (i * i != n) ret.pb(n / i); } } sort(all(ret)); return ret; } /*素因数分解*/ vll factorize(ll n){ vll ret; while (n % 2 == 0){ ret.pb(2); n /= 2; } ll f = 3; while (f * f <= n){ if (n % f == 0){ ret.pb(f); n /= f; }else f += 2; } if (n != 1) ret.pb(n); return ret; } const ll Eramax = 1e6+1; vll Eratos(1,1); void Erainit(){ Eratos.resize(Eramax+1); rep(i,Eramax+1) Eratos[i] = i; for(ll i=2;igx,gyの垂線の距離を算出 */ double distance(ll x, ll y, ll sx, ll sy, ll gx, ll gy){ // distancで複素数で計算してる 垂線の距離なのでsxsy-gxgyが短いときはうまく距離が出せない return distanc(cd(x,y),cd(sx,sy),cd(gx,gy)); } /*3点が同一線上にあるか? */ bool isonLine(ll x1, ll y1, ll x2, ll y2, ll x3, ll y3){ ll dx1 = x1 - x2; ll dy1 = y1 - y2; ll dx2 = x1 - x3; ll dy2 = y1 - y3; return dx2 * dy1 == dx1 * dy2; } #pragma endregion others #pragma endregion fanction int main(){ map A; A['0'] = "0000"; A['1'] = "0001"; A['2'] = "0010"; A['3'] = "0011"; A['4'] = "0100"; A['5'] = "0101"; A['6'] = "0110"; A['7'] = "0111"; A['8'] = "1000"; A['9'] = "1001"; A['A'] = "1010"; A['B'] = "1011"; A['C'] = "1100"; A['D'] = "1101"; A['E'] = "1110"; A['F'] = "1111"; string S; cin >> S; string N;//S.length() * 4 tu if(S.length() * 4 % 3 == 1) N += "00"; elif(S.length() * 4 % 3 == 2) N += '0'; for(auto s:S){ N += A[s]; } vll cnt(8,0); while(!N.empty()){ string t; rep(i,3){ t += N.back(); N.pop_back(); } reverse(all(t)); if(t == "000") cnt[0]++; elif(t == "001") cnt[1]++; elif(t == "010") cnt[2]++; elif(t == "011") cnt[3]++; elif(t == "100") cnt[4]++; elif(t == "101") cnt[5]++; elif(t == "110") cnt[6]++; elif(t == "111") cnt[7]++; } ll ansv = vmax(cnt); vll ans; rep(i,8) if(cnt[i] == ansv) ans.pb(i); rep(i,ans.size()){ cout << ans[i]; if(i == ans.size()-1) cout << endl; else cout << " "; } }