← Home
package main

import (
	"bufio"
	"bytes"
	"io"
	"os"
	"strconv"
)

type FastScanner struct {
	data []byte
	idx  int
}

func NewFastScanner() *FastScanner {
	data, _ := io.ReadAll(os.Stdin)
	return &FastScanner{data: data}
}

func (fs *FastScanner) nextInt() int {
	n := len(fs.data)
	for fs.idx < n && fs.data[fs.idx] <= ' ' {
		fs.idx++
	}
	sign := 1
	if fs.data[fs.idx] == '-' {
		sign = -1
		fs.idx++
	}
	val := 0
	for fs.idx < n && fs.data[fs.idx] > ' ' {
		val = val*10 + int(fs.data[fs.idx]-'0')
		fs.idx++
	}
	return val * sign
}

func (fs *FastScanner) nextString() string {
	n := len(fs.data)
	for fs.idx < n && fs.data[fs.idx] <= ' ' {
		fs.idx++
	}
	start := fs.idx
	for fs.idx < n && fs.data[fs.idx] > ' ' {
		fs.idx++
	}
	return string(fs.data[start:fs.idx])
}

func find(parent []int, x int) int {
	root := x
	for parent[root] != root {
		root = parent[root]
	}
	for parent[x] != x {
		p := parent[x]
		parent[x] = root
		x = p
	}
	return root
}

func zFunction(s string) []int {
	n := len(s)
	z := make([]int, n)
	if n == 0 {
		return z
	}
	z[0] = n
	l, r := 0, 0
	for i := 1; i < n; i++ {
		if i <= r {
			v := z[i-l]
			if v > r-i+1 {
				v = r - i + 1
			}
			z[i] = v
		}
		for i+z[i] < n && s[z[i]] == s[i+z[i]] {
			z[i]++
		}
		if i+z[i]-1 > r {
			l = i
			r = i + z[i] - 1
		}
	}
	return z
}

func main() {
	fs := NewFastScanner()
	t := fs.nextInt()
	var out bytes.Buffer

	for ; t > 0; t-- {
		n := fs.nextInt()
		l := fs.nextInt()
		r := fs.nextInt()
		s := fs.nextString()

		z := zFunction(s)
		buckets := make([][]int, n+1)
		parent := make([]int, n+2)
		for i := 1; i <= n+1; i++ {
			parent[i] = i
		}

		for i := 1; i < n; i++ {
			pos := i + 1
			if z[i] == 0 {
				parent[pos] = find(parent, pos+1)
			} else {
				buckets[z[i]] = append(buckets[z[i]], pos)
			}
		}

		best := make([]int, n+2)

		for x := 1; x <= n; x++ {
			limit := n - x + 1
			cnt := 0
			pos := 1
			for pos <= limit {
				cnt++
				pos = find(parent, pos+x)
			}
			if x > best[cnt] {
				best[cnt] = x
			}
			for _, p := range buckets[x] {
				parent[p] = find(parent, p+1)
			}
		}

		for k := n - 1; k >= 1; k-- {
			if best[k+1] > best[k] {
				best[k] = best[k+1]
			}
		}

		for k := l; k <= r; k++ {
			if k > l {
				out.WriteByte(' ')
			}
			out.WriteString(strconv.Itoa(best[k]))
		}
		out.WriteByte('\n')
	}

	w := bufio.NewWriterSize(os.Stdout, 1<<20)
	w.Write(out.Bytes())
	w.Flush()
}