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 Go (1.6) (judge verdict: Wrong Answer)

package main

import (
	"fmt"
  "sort"
)

var k, c int

func main() {
	var (
		n   int
		str string
		d   []int
	)
	fmt.Scan(&n)
	fmt.Scan(&k)
	fmt.Scan(&c)
	fmt.Scan(&str)

	for i, s := range str {
		if string(s) != "x" {
			d = append(d, i+1)
		}
	}
  ans := same(extract(All(d)))
  sort.Sort(sort.IntSlice(ans))
  for _, a := range ans {
    fmt.Println(a)
  }
}

func All(set []int) (subsets [][]int) {
	length := uint(len(set))

	// Go through all possible combinations of objects
	// from 1 (only first object in subset) to 2^length (all objects in subset)
	for subsetBits := 1; subsetBits < (1 << length); subsetBits++ {
		var subset []int

		for object := uint(0); object < length; object++ {
			// checks if object is contained in subset
			// by checking if bit 'object' is set in subsetBits
			if (subsetBits>>object)&1 == 1 {
				// add object to subset
				subset = append(subset, set[object])
			}
		}
		if len(subset) == k {
			// add subset to subsets
			subsets = append(subsets, subset)
		}
	}
	return subsets
}

func extract(sets [][]int) [][]int {
	var res [][]int
	for _, set := range sets {
		if task(set) {
			res = append(res, set)
		}
	}
  return res
}

func task(set []int) bool {
	for i := 0; i < len(set)-1; i++ {
		if set[i+1]-set[i] < c+1 {
			return false
		}
	}
  return true
}

func same(sets [][]int) []int {
  var res []int
  ma := map[int]int{}

  for _, set := range sets {
    for _, se := range set {
      ma[se]++
    }
  }

  for i, m := range ma {
    if m==len(sets) {
      res = append(res, i)
    }
  }
  return res
}