#include <bits/stdc++.h>
using namespace std;
using lint     = long long;
const lint inf = 1LL << 60;
const lint mod = 1000000007;

// 0-indexed bottom up Segment Tree
// UNIT is the identity element of operation func
template <typename T = int>
struct SegmentTree {
    using F = function<T(T, T)>;
    int n;
    vector<T> dat;
    F func;
    T UNIT;

    SegmentTree(int n_, F func_, T UNIT_) : func(func_), UNIT(UNIT_) {
        n = 1;
        // full binary tree: num of leaves = n = 2^k >= n_
        while (n < n_)
            n *= 2;
        dat.assign(2 * n - 1, UNIT);
    }
    SegmentTree(vector<T> v_, F func_, T UNIT_) : func(func_), UNIT(UNIT_) {
        n      = 1;
        int nv = v_.size();
        while (n < nv)
            n *= 2;
        dat.assign(2 * n - 1, UNIT);
        for (int i = 0; i < nv; ++i) {
            dat[n - 1 + i] = v_[i];
        }
        for (int i = n - 2; i >= 0; --i) {
            dat[i] = func(dat[2 * i + 1], dat[2 * i + 2]);
        }
    }
    void update(int k, T a) {
        // leaves are at index n-1 to 2*n-2
        k += n - 1;
        dat[k] = a;
        while (k > 0) {
            // k -> parent node
            k = (k - 1) / 2;
            // func(child nodes)
            dat[k] = func(dat[2 * k + 1], dat[2 * k + 2]);
        }
    }
    // get result of func() in [l, r)
    T query(int l, int r) {
        l += n - 1;
        r += n - 1;
        T retl = UNIT, retr = UNIT;
        while (l < r) {
            if ((l & 1) == 0)
                retl = func(retl, dat[l]);
            if ((r & 1) == 0)
                retr = func(dat[r - 1], retr);
            l = l / 2;
            r = (r - 1) / 2;
        }
        return func(retl, retr);
    }
};

int main() {
    cin.tie(nullptr);
    ios::sync_with_stdio(false);
    lint n, k, c;
    cin >> n >> k >> c;
    string s;
    cin >> s;
    if (c == 0) {
        int cnt = 0;
        for (int i = 0; i < (int)s.size(); ++i) {
            if (s[i] == 'o')
                cnt++;
        }
        if (cnt < k + 1) {
            for (int i = 0; i < (int)s.size(); ++i) {
                if (s[i] == 'o')
                    cout << i + 1 << "\n";
            }
        }
        return 0;
    }
    auto f          = [](lint l, lint r) { return max(l, r); };
    const lint unit = 0;
    SegmentTree<int> segl(n, f, unit), segr(n, f, unit);
    if (s[0] == 'o')
        segl.update(0, 1);
    for (int i = 1; i < n; ++i) {
        if (s[i] == 'o') {
            int l = 1;
            if (i >= c + 1) {
                l = max(l, segl.query(0, i - c) + 1);
            }
            segl.update(i, l);
        }
    }
    if (s[n - 1] == 'o')
        segr.update(n - 1, 1);
    for (int i = n - 2; i >= 0; --i) {
        if (s[i] == 'o') {
            int r = 1;
            if (i <= n - c - 2) {
                r = max(r, segr.query(i + c + 1, n) + 1);
            }
            segr.update(i, r);
        }
    }
    vector<int> ret(n + 1, 0);
    // for (int i = 0; i < n; ++i) {
    //     cout << segl.query(i, i + 1) << " " << segr.query(i, i + 1) << "\n";
    // }
    for (int i = -c; i < n; ++i) {
        int l = 0, r = 0;
        l = segl.query(0, max(0, i));
        r = segr.query(min(n, i + c), n);
        if (l + r >= k) {
            ret[max(0, i)] += 1;
            ret[min(n, i + c)] += -1;
        }
    }
    for (int i = 1; i <= n; ++i) {
        ret[i] += ret[i - 1];
    }
    for (int i = 0; i < n; ++i) {
        if (s[i] == 'o' && ret[i] == 0)
            cout << i + 1 << "\n";
    }
    return 0;
}

Measured memory_bytes: 5524