```go
package main
import (
"bufio"
"fmt"
"os"
)
type FastScanner struct {
r *bufio.Reader
}
func NewFastScanner() *FastScanner {
return &FastScanner{r: bufio.NewReaderSize(os.Stdin, 1<<20)}
}
func (fs *FastScanner) readByte() byte {
b, err := fs.r.ReadByte()
if err != nil {
return 0
}
return b
}
func (fs *FastScanner) NextInt() int {
b := fs.readByte()
for b <= ' ' {
b = fs.readByte()
}
sign := 1
if b == '-' {
sign = -1
b = fs.readByte()
}
n := 0
for b >= '0' && b <= '9' {
n = n*10 + int(b-'0')
b = fs.readByte()
}
return sign * n
}
func (fs *FastScanner) NextString() string {
b := fs.readByte()
for b <= ' ' {
b = fs.readByte()
}
buf := make([]byte, 0, 16)
for b > ' ' {
buf = append(buf, b)
b = fs.readByte()
}
return string(buf)
}
func main() {
in := NewFastScanner()
out := bufio.NewWriterSize(os.Stdout, 1<<20)
defer out.Flush()
T := in.NextInt()
for ; T > 0; T-- {
s1str := in.NextString()
s2str := in.NextString()
t := in.NextInt()
q := in.NextInt()
n := len(s1str)
s1 := []byte(s1str)
s2 := []byte(s2str)
blocked := make([]bool, n)
expiries := make([][]int, q+t+5)
mismatch := 0
for i := 0; i < n; i++ {
if s1[i] != s2[i] {
mismatch++
}
}
for cur := 1; cur <= q; cur++ {
for _, p := range expiries[cur] {
if blocked[p] {
blocked[p] = false
if s1[p] != s2[p] {
mismatch++
}
}
}
typ := in.NextInt()
if typ == 1 {
pos := in.NextInt() - 1
if !blocked[pos] && s1[pos] != s2[pos] {
mismatch--
}
blocked[pos] = true
expiries[cur+t] = append(expiries[cur+t], pos)
} else if typ == 2 {
a := in.NextInt()
p1 := in.NextInt() - 1
b := in.NextInt()
p2 := in.NextInt() - 1
if p1 != p2 {
if !blocked[p1] && s1[p1] != s2[p1] {
mismatch--
}
if !blocked[p2] && s1[p2] != s2[p2] {
mismatch--
}
} else {
if !blocked[p1] && s1[p1] != s2[p1] {
mismatch--
}
}
if a == 1 && b == 1 {
s1[p1], s1[p2] = s1[p2], s1[p1]
} else if a == 2 && b == 2 {
s2[p1], s2[p2] = s2[p2], s2[p1]
} else if a == 1 && b == 2 {
s1[p1], s2[p2] = s2[p2], s1[p1]
} else { // a == 2 && b == 1
s2[p1], s1[p2] = s1[p2], s2[p1]
}
if p1 != p2 {
if !blocked[p1] && s1[p1] != s2[p1] {
mismatch++
}
if !blocked[p2] && s1[p2] != s2[p2] {
mismatch++
}
} else {
if !blocked[p1] && s1[p1] != s2[p1] {
mismatch++
}
}
} else { // typ == 3
if mismatch == 0 {
fmt.Fprintln(out, "YES")
} else {
fmt.Fprintln(out, "NO")
}
}
}
}
}
```