#include "iostream"
#include "climits"
#include "list"
#include "queue"
#include "stack"
#include "set"
#include "functional"
#include "algorithm"
#include "string"
#include "map"
#include "unordered_map"
#include "unordered_set"
#include "iomanip"
#include "cmath"
#include "random"
#include "bitset"
#include "cstdio"
#include "numeric"
#include "cassert"
#include "ctime"

using namespace std;

constexpr long long int MOD = 1000000007;
//constexpr int MOD = 1000000007;
//constexpr int MOD = 998244353;
//constexpr long long int MOD = 998244353;
constexpr long double EPS = 1e-8;

long long int N, M, K, L, R, H, W;
//int N, M, K, L, R, H, W;

class Segment_Tree {
	vector<long long int>v;
	int num;
	long long int ret;
	public:
		Segment_Tree(int n) {
			n++;
			num = 1;
			while (num < n * 2) {
				num *= 2;
			}
			v.resize(num, -MOD * MOD);
		}
		void Insert(int place, long long int num) {
			place += v.size() / 2;
			v[place] = num;
			place /= 2;
			while (place) {
				v[place] = max(v[place * 2], v[place * 2 + 1]);
				place /= 2;
			}
		}
		long long int RMQ(int a, int b) {
			ret = LLONG_MIN;
			b++;
			for (a += num / 2, b += num / 2; a < b; a >>= 1, b >>= 1) {
				if (a & 1)ret = max(ret, v[a++]);
				if (b & 1)ret = max(ret, v[--b]);
			}
			return ret;
		}
};

int main() {
	ios::sync_with_stdio(false);
	cin.tie(0);

	cin >> N >> M >> K;
	string s;
	cin >> s;
	s = "A" + s + "A";
	int box = 0;
	int lst = 0;
	for (int i = 1; i <= N; i++) {
		if (s[i] == 'o'&&i > lst) {
			lst = i + K;
			box++;
		}
	}
	/*
	如果最长链的长度>M
	1.点i不在链上：链上的任意一种方式都不包含i；
	2.点i在链上：设S为最长链的长度
	  ∵ S>M，
	  ∴S-1>=M
	  则一定存在一种方式从链上去掉i组合（不包含i）。
	*/
	/*********************************************************************/
	//                                                                   //
	//                         speacil judge                             //
	//                                                                   //
	/*********************************************************************/
	if (box > M) {
		return 0;
	}
	Segment_Tree l(N + 2);//左线段树
	Segment_Tree r(N + 2);//右线段树
	/*********************************************************************/
	//                                                                   //
	//                         左线段树更新                              //
	//                                                                   //
	/*********************************************************************/
	l.Insert(0, 0);
	for (int i = 1; i <= N; i++) {
		int add = l.RMQ(0, max(0LL, i - K - 1));
		if (s[i] == 'o')add++;
		l.Insert(i, add);
	}
	/*********************************************************************/
	//                                                                   //
	//                         右线段树更新                              //
	//                                                                   //
	/*********************************************************************/
	r.Insert(N + 1, 0);
	for (int i = N; i >= 1; i--) {
		int add = r.RMQ(min(N + 1, i + K + 1), N + 1);
		if (s[i] == 'o')add++;
		r.Insert(i, add);
	}
	vector<vector<int>>ans(M + 1);
	for (int i = 1; i <= N; i++) {
		if (l.RMQ(0, max(0LL, i - K - 1)) + r.RMQ(min(N + 1, i + K + 1), N + 1) == M - 1 && s[i] == 'o')
			ans[l.RMQ(0, max(0LL, i - K - 1))].push_back(i);
	}
	for (int i = 0; i <= M; i++) {
		if (ans[i].size() == 1)cout << ans[i].front() << endl;
	}
}

Measured memory_bytes: 20816