//#include <bits/stdc++.h>
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstdlib>
#include <string>
#include <vector>
#include <map>
#include <queue>
#include <functional>
using namespace std;

typedef long long ll;
typedef vector<int> vint;
typedef vector<vector<int> > vvint;
typedef vector<long long> vll, vLL;
typedef vector<vector<long long> > vvll, vvLL;
#define FOR(i,a,b) for(int i=(a);i<(b);++i)
#define REP(i,n) for(int i=0;i<n;++i)
#define mod (ll)(1e9+7)
#define FIX(a) ((a)%mod+mod)%mod
#define ALL(obj) (obj).begin(), (obj).end()
#define rALL(obj) (obj).rbegin(), (obj).rend()
#define INF 1000000000 //1e9
#define LLINF 2000000000000000000LL //2e18
#define fi first
#define se second
#define pb push_back
int dy[]={0, 0, 1, -1};
int dx[]={1, -1, 0, 0};
template< typename Monoid >
struct SegmentTree {
  using F = function< Monoid(Monoid, Monoid) >;

  int sz;
  vector< Monoid > seg;

  const F f;
  const Monoid M1;

  SegmentTree(int n, const F f, const Monoid &M1) : f(f), M1(M1) {
    sz = 1;
    while(sz < n) sz <<= 1;
    seg.assign(2 * sz, M1);
  }

  void set(int k, const Monoid &x) {
    seg[k + sz] = x;
  }

  void build() {
    for(int k = sz - 1; k > 0; k--) {
      seg[k] = f(seg[2 * k + 0], seg[2 * k + 1]);
    }
  }

  void update(int k, const Monoid &x) {
    k += sz;
    seg[k] = x;
    while(k >>= 1) {
      seg[k] = f(seg[2 * k + 0], seg[2 * k + 1]);
    }
  }

  Monoid query(int a, int b) {
    Monoid L = M1, R = M1;
    for(a += sz, b += sz; a < b; a >>= 1, b >>= 1) {
      if(a & 1) L = f(L, seg[a++]);
      if(b & 1) R = f(seg[--b], R);
    }
    return f(L, R);
  }

  Monoid operator[](const int &k) const {
    return seg[k + sz];
  }

  template< typename C >
  int find_subtree(int a, const C &check, Monoid &M, bool type) {
    while(a < sz) {
      Monoid nxt = type ? f(seg[2 * a + type], M) : f(M, seg[2 * a + type]);
      if(check(nxt)) a = 2 * a + type;
      else M = nxt, a = 2 * a + 1 - type;
    }
    return a - sz;
  }


  template< typename C >
  int find_first(int a, const C &check) {
    Monoid L = M1;
    if(a <= 0) {
      if(check(f(L, seg[1]))) return find_subtree(1, check, L, false);
      return -1;
    }
    int b = sz;
    for(a += sz, b += sz; a < b; a >>= 1, b >>= 1) {
      if(a & 1) {
        Monoid nxt = f(L, seg[a]);
        if(check(nxt)) return find_subtree(a, check, L, false);
        L = nxt;
        ++a;
      }
    }
    return -1;
  }

  template< typename C >
  int find_last(int b, const C &check) {
    Monoid R = M1;
    if(b >= sz) {
      if(check(f(seg[1], R))) return find_subtree(1, check, R, true);
      return -1;
    }
    int a = sz;
    for(b += sz; a < b; a >>= 1, b >>= 1) {
      if(b & 1) {
        Monoid nxt = f(seg[--b], R);
        if(check(nxt)) return find_subtree(b, check, R, true);
        R = nxt;
      }
    }
    return -1;
  }
};
int main(){
    cin.tie(0);
    ios::sync_with_stdio(false);
    ll n,k,c;
    cin >> n >> k >> c;
    string s;
    cin >> s;
    vll dpl(n,0LL),dpr(n,0LL);
    if(s[0]=='o'){
        dpl[0]=1;
    }else{
        dpl[0]=0;
    }
    for(ll i=1;i<n;i++){
        if(s[i]=='o'){
            if(i-c-1>=0){
                dpl[i]=max(dpl[i-c-1]+1,dpl[i-1]);
            }else{
                dpl[i]=max(1LL,dpl[i-1]);
            }
        }else{
            dpl[i] = dpl[i-1];
        }
    }
    if(s[n-1]=='o'){
        dpr[n-1]=1;
    }else{
        dpr[n-1]=0;
    }
    for(ll i = n-2;i>=0;i--){
        if(s[i]=='o'){
            if(i+c+1<=n-1){
                dpr[i]=max(dpr[i+c+1]+1, dpr[i+1]);
            }else{
                dpr[i]=max(1LL, dpr[i+1]);
            }
        }else{
            dpr[i] = dpr[i+1];
        }
    }
    /*
    REP(i,n){
        cout << dpr[i] << " " << dpl[i] << endl;
    }
    */
    SegmentTree< int > seg(n, [](int a, int b) { return max(a, b); }, 0);
    REP(i,n){
        if(s[i]=='o'){
            int cnt = 1;
            if(i-c-1>=0){
                cnt+=dpl[i-c-1];
            }
            if(i+c+1<=n-1){
                cnt+=dpr[i+c+1];
            }
            if(cnt>=k){
                //cout << i << ":" << cnt << endl;
                seg.update(i,1);
            }else{
                seg.update(i,0);
            }
            
        }
    }
    REP(i,n){
        //cout << seg.query(i,i+1) << endl;
    }
    int ans = 0;
    REP(i,n){
        if(seg.query(i,i+1)==1){
            seg.update(i,0);
            int x = seg.query(max(0LL,i-c),min(n-1,i+c)+1);
            if(x==0){
                int cnt = 0;
                if(i-c-1>=0){
                    cnt+=dpl[i-c-1];
                }
                if(i+c+1<=n-1){
                    cnt+=dpr[i+c+1];
                }
                if(cnt<k){
                    cout << i+1 << endl;
                    ans++;
                }
            }
            seg.update(i,1);
        }
    }
    if(ans==0){
        cout << endl;
    }

    return 0;
}

Measured memory_bytes: 7060