package main
import (
"bufio"
"io"
"os"
)
type FastReader struct {
data []byte
idx int
n int
}
func NewFastReader() *FastReader {
data, _ := io.ReadAll(os.Stdin)
return &FastReader{data: data, n: len(data)}
}
func (fr *FastReader) nextInt() int {
for fr.idx < fr.n && fr.data[fr.idx] <= ' ' {
fr.idx++
}
sign := 1
if fr.idx < fr.n && fr.data[fr.idx] == '-' {
sign = -1
fr.idx++
}
val := 0
for fr.idx < fr.n {
c := fr.data[fr.idx]
if c < '0' || c > '9' {
break
}
val = val*10 + int(c-'0')
fr.idx++
}
return val * sign
}
func (fr *FastReader) nextString() string {
for fr.idx < fr.n && fr.data[fr.idx] <= ' ' {
fr.idx++
}
start := fr.idx
for fr.idx < fr.n && fr.data[fr.idx] > ' ' {
fr.idx++
}
return string(fr.data[start:fr.idx])
}
type DSU struct {
parent []int
size []int
}
func NewDSU(n int) *DSU {
parent := make([]int, n)
size := make([]int, n)
for i := 0; i < n; i++ {
parent[i] = i
size[i] = 1
}
return &DSU{parent: parent, size: size}
}
func (d *DSU) Find(x int) int {
root := x
for d.parent[root] != root {
root = d.parent[root]
}
for x != root {
p := d.parent[x]
d.parent[x] = root
x = p
}
return root
}
func (d *DSU) Union(a, b int) {
ra := d.Find(a)
rb := d.Find(b)
if ra == rb {
return
}
if d.size[ra] < d.size[rb] {
ra, rb = rb, ra
}
d.parent[rb] = ra
d.size[ra] += d.size[rb]
}
func main() {
in := NewFastReader()
out := bufio.NewWriterSize(os.Stdout, 1<<20)
defer out.Flush()
T := in.nextInt()
for ; T > 0; T-- {
n := in.nextInt()
k := in.nextInt()
s := in.nextString()
t := in.nextString()
dsu := NewDSU(n)
if k < n {
for i := 0; i+k < n; i++ {
dsu.Union(i, i+k)
}
}
if k+1 < n {
for i := 0; i+k+1 < n; i++ {
dsu.Union(i, i+k+1)
}
}
cnt := make([][26]int32, n)
for i := 0; i < n; i++ {
r := dsu.Find(i)
cnt[r][s[i]-'a']++
cnt[r][t[i]-'a']--
}
ok := true
for i := 0; i < n && ok; i++ {
if dsu.parent[i] == i {
for c := 0; c < 26; c++ {
if cnt[i][c] != 0 {
ok = false
break
}
}
}
}
if ok {
out.WriteString("YES\n")
} else {
out.WriteString("NO\n")
}
}
}