Problem:
Score : 500 points

Problem Statement

Takahashi has decided to work on K days of his choice from the N days starting with tomorrow.

You are given an integer C and a string S. Takahashi will choose his workdays as follows:

After working for a day, he will refrain from working on the subsequent C days.

If the i-th character of S is x, he will not work on Day i, where Day 1 is tomorrow, Day 2 is the day after tomorrow, and so on.

Find all days on which Takahashi is bound to work.

Constraints

1 \leq N \leq 2 \times 10^5

1 \leq K \leq N

0 \leq C \leq N

The length of S is N.

Each character of S is o or x.

Takahashi can choose his workdays so that the conditions in Problem Statement are satisfied.

Input

Input is given from Standard Input in the following format:

N K C
S

Output

Print all days on which Takahashi is bound to work in ascending order, one per line.

Sample Input 1

11 3 2
ooxxxoxxxoo

Sample Output 1

6

Takahashi is going to work on 3 days out of the 11 days. After working for a day, he will refrain from working on the subsequent 2 days.

There are four possible choices for his workdays: Day 1,6,10, Day 1,6,11, Day 2,6,10, and Day 2,6,11.

Thus, he is bound to work on Day 6.

Sample Input 2

5 2 3
ooxoo

Sample Output 2

1
5

There is only one possible choice for his workdays: Day 1,5.

Sample Input 3

5 1 0
ooooo

Sample Output 3

There may be no days on which he is bound to work.

Sample Input 4

16 4 3
ooxxoxoxxxoxoxxo

Sample Output 4

11
16

Solution in C (GCC 5.4.1) (judge verdict: Wrong Answer)

#include <stdio.h>

#define KI_MAX (1 << 18) /* 262144 */

typedef struct ki_t {
	int ki[KI_MAX * 2 - 1], all[KI_MAX * 2 - 1];
} ki_t;

int tnh(int a, int b) { /* 小さくない方 */
	return a >= b ? a : b;
}

void add_i(ki_t* ki, int idx, int qmin, int qmax, int smin, int smax, int v) {
	if (qmax <= smin || smax <= qmin) { /* セグメントがクエリから完全に外れている */
		/* nop */
	} else if (qmin <= smin && smax <= qmax) { /* セグメントがクエリに完全に含まれる */
		ki->all[idx] = tnh(ki->all[idx], v);
	} else {
		int smid = smin + (smax - smin) / 2;
		int lidx = idx * 2 + 1, ridx = idx * 2 + 2;
		ki->all[lidx] = tnh(ki->all[lidx], ki->all[idx]);
		ki->all[ridx] = tnh(ki->all[ridx], ki->all[idx]);
		ki->all[idx] = 0;
		add_i(ki, lidx, qmin, qmax, smin, smid, v);
		add_i(ki, ridx, qmin, qmax, smid, smax, v);
		ki->ki[idx] = tnh(tnh(ki->ki[lidx], ki->all[lidx]), tnh(ki->ki[ridx], ki->all[ridx]));
	}
}

void add(ki_t* ki, int min, int max, int v) {
	if (ki != NULL && min < max) add_i(ki, 0, min, max, 0, KI_MAX, v);
}

int get_i(ki_t* ki, int idx, int qmin, int qmax, int smin, int smax) {
	if (qmax <= smin || smax <= qmin) { /* セグメントがクエリから完全に外れている */
		return 0;
	} else if (qmin <= smin && smax <= qmax) { /* セグメントがクエリに完全に含まれる */
		return tnh(ki->ki[idx], ki->all[idx]);
	} else {
		int smid = smin + (smax - smin) / 2;
		int lidx = idx * 2 + 1, ridx = idx * 2 + 2;
		int left = get_i(ki, lidx, qmin, qmax, smin, smid);
		int right = get_i(ki, ridx, qmin, qmax, smid, smax);
		return tnh(tnh(left, right), ki->all[idx]);
	}
}

int get(ki_t* ki, int min, int max) {
	return ki != NULL && min < max ? get_i(ki, 0, min, max, 0, KI_MAX) : 0;
}

int N, K, C;
char S[271828];

ki_t k1, k2, k3;

#define INFU 222222

int main(void) {
	int i;
	if (scanf("%d%d%d", &N, &K, &C) != 3) return 1;
	if (scanf("%271827s", S) != 1) return 1;

	/* クールダウン含めそこまでで何日 */
	for (i = 0; i < N; i++) {
		int cur = get(&k1, i, i + 1);
		if (S[i] != 'x') add(&k1, i + C + 1, INFU, cur + 1);
	}
	/* そこから何日 */
	for (i = N - 1; i >= 0; i--) {
		int a = get(&k2, i + 1, INFU);
		int b = S[i] != 'x' ? get(&k2, i + C + 1, INFU) + 1 : 0;
		add(&k2, i, i + 1, tnh(a, b));
	}

	for (i = 0; i <= N + C; i++) add(&k3, i, i + 1, get(&k1, i, i + 1) + get(&k2, i, i + 1));

#if 0
	for (i = 0; i < N; i++) {
		printf("  %c", S[i]);
	}
	puts("");
	for (i = 0; i <= N + C; i++) {
		printf("%3d", get(&k1, i, i + 1));
	}
	puts("");
	for (i = 0; i < N; i++) {
		printf("%3d", get(&k2, i, i + 1));
	}
	puts("");
#endif
	for (i = 0; i < N; i++) {
		if (S[i] == 'o' && get(&k3, i + 1, i + C + 1) < K) printf("%d\n", i + 1);
	}

	return 0;
}

/*

働く→C日後以降のoへ
働かない→明日以降のoへ

「そこを外したとき、何日働けるか」

クールダウン含めそこまでで何日
そこから何日

*/