func_code_string: #include <bits/stdc++.h>      using namespace std;      typedef int int2;   #define int long long      #define pi pair<int, int>   #define mp make_pair   #define pb push_back   #define eb emplace_back   #define f first   #define s second   #define INF 1e18      string printed(int mask) {       string res;       for (int i = 0; i < 26; i++) {           if (mask & (1 << i)) {               res +=  1 ;           } else {               res +=  0 ;           }       }       return res;   }      int2 main() {       ios::sync_with_stdio(0);       cin.tie(0);          int n, a, b;       cin >> n >> a >> b;       string st;       cin >> st;          vector<int> elts_prev(n);       vector<int> mapping(26);       vector<int> backmap(26);       vector<int> elts(n);       fill(mapping.begin(), mapping.end(), -1);       int curmap = 0;       for (int i = 0; i < n; i++) {           elts_prev[i] = st[i] -  a ;           // cout <<  mapping:   << mapping[elts_prev[i]] <<   n ;           if (mapping[elts_prev[i]] == -1) {               mapping[elts_prev[i]] = curmap;               backmap[curmap] = elts_prev[i];               curmap++;               // cout <<  i:   << i <<   , curmap:   << curmap <<  , elts_prev:   << elts_prev[i] <<   n ;           }       }       for (int i = 0; i < n; i++) {           elts[i] = mapping[elts_prev[i]];       }       vector<int> l(curmap), r(curmap), freq(curmap);       fill(l.begin(), l.end(), INF);       fill(r.begin(), r.end(), -INF);       for (int i = 0; i < n; i++) {           l[elts[i]] = min(l[elts[i]], i);           r[elts[i]] = max(r[elts[i]], i);           freq[elts[i]]++;       }          int maxn = 1 << curmap;          vector<bool> satisfy(maxn);       vector<int> dp(maxn);       fill(dp.begin(), dp.end(), -1);          dp[0] = 1;          // cout <<  curmap:   << curmap <<   n ;       // if (n == 5000 and a == 1 and b == 1 and st[0] ==  o ) {       //     cout <<  curmap:   << curmap <<   n ;       // }       function<int(int)> solve = [&](int i) {           if (~dp[i]) return dp[i];           dp[i] = 0;           int ll = INF, rr = -INF;           int amt = 0;           vector<int> elts;           for (int j = 0; j < curmap; j++) {               if (i & (1 << j)) {                   rr = max(rr, r[j]);                   ll = min(ll, l[j]);                   amt += freq[j];                   elts.pb(j);               }           }              // want amt >= (a / b) * (rr - ll + 1), i.e. amt >= ceil((a / b) * (rr - ll + 1)), i.e. amt >= (a * (rr - ll + 1) + (b - 1)) / b           bool can_change = (amt >= ((a * (rr - ll + 1) + (b - 1)) / b));              // Case 1: change all elements to color j           if (can_change) {               for (int j: elts) {                   dp[i] |= solve(i ^ (1 << j));               }           }              // Case 2: multiple subtrees           int cur_mask = 0;           for (int j: elts) {               cur_mask |= (1 << j);               if (cur_mask == i) break;               dp[i] |= (solve(cur_mask) & solve(i ^ cur_mask));           }           // cout <<  mask:   << printed(i) <<  , ll:   << ll <<  , rr:   << rr <<  , amt:   << amt <<  , dp:   << dp[i] <<   n ;           return dp[i];       };          vector<int> ans;       for (int i = 0; i < curmap; i++) {           if (solve((maxn - 1) ^ (1 << i)) == 1) {               ans.pb(backmap[i]);           }       }       sort(ans.begin(), ans.end());       cout << ans.size() <<    ;       for (int i = 0; i < (int)ans.size(); i++) {           cout << (char)( a  + ans[i]) <<    ;       }       cout <<   n ;   }