#include <bits/stdc++.h>
using namespace std;

//////////////////////////////   Begin Macros

#define all(x) (x).begin(), (x).end()
#define rep(i, N) for (int i = 0; i < (int)(N); i++)
#define reps(i, s, N) for (int i = (s); i < (int)(N); i++)
#define reprev(i, N) for (int i = N - 1; i >= 0; i--)
#define rep1(i, N) for (int i = 1; i <= N; i++)
#define rep1s(i, s, N) for (int i = 1; i <= N; i++)

using ll = long long int;
using pii = pair<int, int>;
using pll = pair<ll, ll>;

template <typename T>
bool chmax(T &m, const T q)
{
  if (m < q)
  {
    m = q;
    return true;
  }
  else
    return false;
}
template <typename T>
bool chmin(T &m, const T q)
{
  if (m > q)
  {
    m = q;
    return true;
  }
  else
    return false;
}
template <typename T1, typename T2>
pair<T1, T2> operator+(const pair<T1, T2> &l, const pair<T1, T2> &r) { return {l.first + r.first, l.second + r.second}; }
template <typename T1, typename T2>
pair<T1, T2> operator-(const pair<T1, T2> &l, const pair<T1, T2> &r) { return {l.first - r.first, l.second - r.second}; }
template <typename T>
pair<T, T> operator*(const pair<T, T> &l, const T &r) { return {l.first * r, l.second * r}; }
template <typename T>
pair<T, T> operator/(const pair<T, T> &l, const T &r) { return {l.first / r, l.second / r}; }
template <typename T>
istream &operator>>(istream &is, vector<T> &vec)
{
  for (auto &v : vec)
    is >> v;
  return is;
}
template <typename T>
ostream &operator<<(ostream &os, const vector<T> &vec)
{
  os << "[";
  for (auto v : vec)
    os << v << ",";
  os << "]";
  return os;
}
template <typename T>
ostream &operator<<(ostream &os, const deque<T> &vec)
{
  os << "deq[";
  for (auto v : vec)
    os << v << ",";
  os << "]";
  return os;
}
template <typename T>
ostream &operator<<(ostream &os, const set<T> &vec)
{
  os << "{";
  for (auto v : vec)
    os << v << ",";
  os << "}";
  return os;
}
template <typename T>
ostream &operator<<(ostream &os, const unordered_set<T> &vec)
{
  os << "{";
  for (auto v : vec)
    os << v << ",";
  os << "}";
  return os;
}
template <typename T>
ostream &operator<<(ostream &os, const multiset<T> &vec)
{
  os << "{";
  for (auto v : vec)
    os << v << ",";
  os << "}";
  return os;
}
template <typename T>
ostream &operator<<(ostream &os, const unordered_multiset<T> &vec)
{
  os << "{";
  for (auto v : vec)
    os << v << ",";
  os << "}";
  return os;
}
template <typename T1, typename T2>
ostream &operator<<(ostream &os, const pair<T1, T2> &pa)
{
  os << "(" << pa.first << "," << pa.second << ")";
  return os;
}
template <typename TK, typename TV>
ostream &operator<<(ostream &os, const map<TK, TV> &mp)
{
  os << "{";
  for (auto v : mp)
    os << v.first << "=>" << v.second << ",";
  os << "}";
  return os;
}
template <typename TK, typename TV>
ostream &operator<<(ostream &os, const unordered_map<TK, TV> &mp)
{
  os << "{";
  for (auto v : mp)
    os << v.first << "=>" << v.second << ",";
  os << "}";
  return os;
}

template <typename T>
void reset(vector<T> &v, const T reset_to)
{
  for (auto &x : v)
    x = reset_to;
}
inline int popcount(const unsigned int x) { return __builtin_popcount(x); }
#define dbg(x) cerr << #x << " = " << (x) << " (L" << __LINE__ << ") " << __FILE__ << endl;

const int intinf = numeric_limits<int>::max();
const pii udlr[4] = {{1, 0}, {0, 1}, {-1, 0}, {0, -1}};

//////////////////////////////   End Macros

void solve()
{
  int N, K, C;
  cin >> N >> K >> C;
  string S;
  cin >> S;

  vector<int> first, second, last;
  vector<vector<int>> iss;
  rep(i, N)
  {
    // dbg(i);
    vector<int> is_;
    if (S[i] == 'x')
      continue;
    is_.push_back(i);
    first.push_back(i);
    int i_second = -1;
    int i_last = i;
    rep1(j, C)
    {
      int i_tmp = i + j;
      if (!(i_tmp < N))
        break;

      if (S[i_tmp] == 'x')
        continue;

      is_.push_back(i_tmp);
      if (i_second == -1)
        i_second = i_tmp;

      i_last = i_tmp;
    }
    second.push_back(i_second);
    last.push_back(i_last);
    iss.push_back(is_);
    i += C;
  }

  if (first.size() > K)
    return;

  assert(first.size() == K);

  vector<int> ans;
  int i_last_prev = 1e9;
  reprev(j, first.size())
  {
    if (second[j] == -1 or !(second[j] < i_last_prev - C))
      ans.push_back(first[j]);

    auto it_last = lower_bound(all(iss[j]), i_last_prev - C);
    it_last--;
    i_last_prev = *it_last;
    // dbg(i_last_prev);
  }

  reprev(k, ans.size())
  {
    cout << ans[k] + 1 << endl;
  }
  // dbg(first);
  // dbg(second);
  // dbg(last);
}

int main()
{
  solve();
  return 0;
}


Measured memory_bytes: 17584