Решение
import java.io.BufferedReader
import java.io.BufferedWriter
import java.io.InputStreamReader
import java.io.OutputStreamWriter
fun main(args: Array<String>) {
val reader = BufferedReader(InputStreamReader(System.`in`))
val writer = BufferedWriter(OutputStreamWriter(System.out))
val t = reader.readLine().toInt()
for (i in 0 until t) {
val s1 = reader.readLine()
val s2 = reader.readLine()
if (s1.length != s2.length) {
writer.write("NO")
writer.newLine()
continue
}
// Массив mapping хранит для каждой буквы из s1 её соответствие в s2, -1 - если не задано
val mapping = IntArray(26) { -1 }
// Массив used помечает, какие буквы уже сопоставлены (использованы в качестве образа)
val used = BooleanArray(26) { false }
var possible = true
for (j in s1.indices) {
val c1 = s1[j] - 'a'
val c2 = s2[j] - 'a'
if (mapping[c1] == -1) {
if (used[c2]) { // Если буква c2 уже была сопоставлена с другой буквой, переобразование невозможно
possible = false
break
}
mapping[c1] = c2
used[c2] = true
} else {
if (mapping[c1] != c2) { // Если существующее соответствие не совпадает с требуемым
possible = false
break
}
}
}
writer.write(if (possible) "YES" else "NO")
writer.newLine()
}
writer.flush()
reader.close()
writer.close()
}