#include <iostream>
#include <cstdlib>
#include <algorithm>
#include <cmath>
#include <vector>
#include <set>
#include <map>
#include <unordered_set>
#include <unordered_map>
#include <queue>
#include <ctime>
#include <cassert>
#include <complex>
#include <string>
#include <cstring>
#include <chrono>
#include <random>
#include <bitset>
using namespace std;

template <typename A, typename B>
string to_string(pair<A, B> p);
 
template <typename A, typename B, typename C>
string to_string(tuple<A, B, C> p);
 
template <typename A, typename B, typename C, typename D>
string to_string(tuple<A, B, C, D> p);
 
string to_string(const string& s) {
  return '"' + s + '"';
}
 
string to_string(const char* s) {
  return to_string((string) s);
}
 
string to_string(bool b) {
  return (b ? "true" : "false");
}
 
string to_string(vector<bool> v) {
  bool first = true;
  string res = "{";
  for (int i = 0; i < static_cast<int>(v.size()); i++) {
    if (!first) {
      res += ", ";
    }
    first = false;
    res += to_string(v[i]);
  }
  res += "}";
  return res;
}
 
template <size_t N>
string to_string(bitset<N> v) {
  string res = "";
  for (size_t i = 0; i < N; i++) {
    res += static_cast<char>('0' + v[i]);
  }
  return res;
}
 
template <typename A>
string to_string(A v) {
  bool first = true;
  string res = "{";
  for (const auto &x : v) {
    if (!first) {
      res += ", ";
    }
    first = false;
    res += to_string(x);
  }
  res += "}";
  return res;
}
 
template <typename A, typename B>
string to_string(pair<A, B> p) {
  return "(" + to_string(p.first) + ", " + to_string(p.second) + ")";
}
 
template <typename A, typename B, typename C>
string to_string(tuple<A, B, C> p) {
  return "(" + to_string(get<0>(p)) + ", " + to_string(get<1>(p)) + ", " + to_string(get<2>(p)) + ")";
}
 
template <typename A, typename B, typename C, typename D>
string to_string(tuple<A, B, C, D> p) {
  return "(" + to_string(get<0>(p)) + ", " + to_string(get<1>(p)) + ", " + to_string(get<2>(p)) + ", " + to_string(get<3>(p)) + ")";
}
 
void debug_out() { cerr << endl; }
 
template <typename Head, typename... Tail>
void debug_out(Head H, Tail... T) {
  cerr << " " << to_string(H);
  debug_out(T...);
}
 
#ifdef LOCAL
#define debug(...) cerr << "[" << #__VA_ARGS__ << "]:", debug_out(__VA_ARGS__)
#else
#define debug(...) 42
#endif

typedef long long ll;

void mmin(int &a, int b) {
    a = min(a, b);
}

void mmax(int &a, int b) {
    a = max(a, b);
}

int main() {
	ios::sync_with_stdio(false);
	cin.tie(0);
	
    int n, a, b;
    cin >> n >> a >> b;
    string s;
    cin >> s;

    vector<pair<int, int>> p(26, {n, -1}); 
    vector<int> cnt(26);
    int m = 0;
    for (int i = 0; i < n; i++) {
        mmin(p[s[i] - 'a'].first, i);
        mmax(p[s[i] - 'a'].second, i);
        if (!cnt[s[i] - 'a']) m++;
        cnt[s[i] - 'a']++;
    }
    
    sort(p.begin(), p.end());
    
    vector<bool> dp(1 << m);
    dp[0] = true;
    for (int mask = 1; mask < (1 << m); mask++) {
        int total = 0;
        int left = n, right = -1;
        for (int i = 0; i < m; i++) {
            if ((1 << i) & mask) {
                total += cnt[s[p[i].first] - 'a'];
                left = min(left, p[i].first);
                right = max(right, p[i].second);
            }
        }
        if (a * (right - left + 1) <= b * total) {
            for (int i = 0; i < m; i++) {
                if (!((1 << i) & mask)) continue;
                dp[mask] = dp[mask] ||  dp[mask ^ (1 << i)];
            }
        }
        for (int i = 0; i < m - 1; i++) {
            dp[mask] = dp[mask] || (dp[mask & ~((1 << (i + 1)) - 1)] && dp[mask & ((1 << (i + 1)) - 1)]);
        }
    }
    
    vector<char> answer;
    for (int i = 0; i < m; i++) {
        if (dp[~(1 << i) & ((1 << m) - 1)]) 
            answer.push_back(s[p[i].first]);
    }
    sort(answer.begin(), answer.end());
    cout << answer.size();
    for (char i : answer) {
        cout << ' ' << i ;
    }
    cout << '\n';
}