#include <iostream>
#include <iomanip>
#include <random>
#include <algorithm>
#include <vector>
#include <set>
#include <map>
#include <cmath>
#include <numeric>
#include <cstdlib>
#include <cstring>
#include <deque>
#include <sstream>
#include <bitset>
#include <cassert>
#include <fstream>
#include <queue>

#define len(X) ((int)(X).size())

#ifdef __LOCAL
	#define DEBUG_OUTPUT_ENABLED 1
	#define DBG(X) dout << #X << "=" << (X) << '\n';
	#define SAY(X) dout << (X) << '\n';
#else
	#define DEBUG_OUTPUT_ENABLED 0
	#define DBG(X) 42;
	#define SAY(X) 42;
#endif

#define dout   debug::instance

using namespace std;

template<typename T, typename S> inline ostream& operator<<(ostream& os, const pair<T, S> p) { cout << "[" << p.first << ";" << p.second << "]"; return os; }
template<typename T> inline ostream& operator<<(ostream& os, const vector<T>& v) { for(auto el: v) cout << el << " "; return os; }
namespace debug {
	struct DebugStream {
		private:
			bool is_first;
		public:
			DebugStream(bool _is_first): is_first(_is_first) {}
			template<typename T> DebugStream operator<<(const T& value) const {
				assert(DEBUG_OUTPUT_ENABLED);
				if(is_first) cout << "[DBG] ";
				cout << value;
				return DebugStream(false);
			};

			template<typename T> DebugStream printArray(T* l, T* r) {
				assert(DEBUG_OUTPUT_ENABLED);
				if(is_first) cout << "[DBG] ";
				while(l != r) {
					cout << (*l);
					++l;
					if(l == r) {
						cout << '\n';
					} else {
						cout << ' ';
					}
				}
				return DebugStream(false);
			}
	};
	DebugStream instance(true);
};

using ll = long long int;
using ull = unsigned long long int;
using ld  = long double;
using pii = pair<int, int>;
using pll = pair<ll, ll>;

const int INT_INF = (int)(2e9);
const ll  LL_INF  = (ll)(2e18);

const int NIL = -1;
static mt19937 _g(time(nullptr));

inline ll randint(ll a, ll b) { ll w = (_g() << 31LL) ^ _g(); return a + w % (b - a + 1); }
inline void fast_io() { ios_base::sync_with_stdio(false); cin.tie(nullptr); cout.tie(nullptr); };
template<typename T> inline T sign(T x) { return T(x > 0) - T(x < 0); }
template<typename T> inline T fetch() { T ret; cin >> ret; return ret; }
template<typename T> inline vector<T> fetch_vec(int sz) { vector<T> ret(sz); for(auto& elem: ret) cin >> elem; return ret; }
const int MAXN = (int)3e5 + 77;
int n, k, c;
string S;
int dp[MAXN];
int nextnonx[MAXN], p[MAXN];
int get(int l, int r) {
	int rez = p[r];
	if(l) rez -= p[l - 1];
	return rez;
}
vector<int> solve() {
	vector<int> rez;
	cin >> n >> k >> c >> S;
	for(int i = n - 1; i >= 0; --i) {
		dp[i] = dp[i + 1];
		if(S[i] != 'x') dp[i] = max(dp[i], dp[i + 1 + c] + 1);
	}
	nextnonx[n] = INT_INF;
	for(int i = n - 1; i >= 0; --i) {
		if(S[i] != 'x') nextnonx[i] = i;
		else nextnonx[i] = nextnonx[i + 1];
	}
	p[0] = (S[0] == 'o');
	for(int i = 1; i < n; ++i) p[i] = p[i - 1] + (S[i] == 'o');
	//(dout << "@DP: ").printArray(dp, dp + n);
	if(dp[0] > k) return rez;
	int i = 0;
	while(i < n && k >= 0) {
		int j = i;
		while(j < n && j < n && dp[j + 1 + c] >= k - 1) ++j;
		//DBG(i); DBG(j);
		if(get(i, j - 1) == 1) rez.emplace_back(nextnonx[i]);
		--k;
		i = nextnonx[i];
		i += c + 1;
	}
	return rez;
}

int main() {
	fast_io();
	auto out = solve();
	for(auto& x: out) cout << x + 1 << '\n';
	return 0;
}


Measured memory_bytes: 5004