Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- package sprint4.tasks.I
- import java.io.BufferedReader
- import java.io.InputStreamReader
- import java.util.*
- import kotlin.math.min
- fun main() {
- val bufferedReader = BufferedReader(InputStreamReader(System.`in`))
- val firstArr = bufferedReader.readResults()
- val secondArr = bufferedReader.readResults()
- // Одинаковая последовательность не может быть больше минимальной из длин массивов
- // Поэтому первым делом проверяем эту длину
- val h = getCommonSubArrayLen(firstArr, secondArr, min(firstArr.size, secondArr.size))
- println(h)
- }
- private fun getCommonSubArrayLen(
- firstArr: List<Int>,
- secondArr: List<Int>,
- curCandidate: Int,
- //Изначально кандидатов нет, так что заглушим его
- prevCandidate: Int = 0
- ): Int {
- // По алгоритму мы сужаем поиск, поэтому текущий кандидат не может стать меньше или даже равным предыдущему
- if (curCandidate <= prevCandidate) return prevCandidate
- return when (checkSubArrayExists(firstArr, secondArr, curCandidate)) {
- true -> {
- // Если текущий кандидат нам подходит (есть одинаковые подмассивы указанной длины
- // То рекурсивно ищем справа от него: искомый будет не меньше текущего и не больше минимальной длины двух оригинальных массивов
- val minSize = min(firstArr.size, secondArr.size)
- val newH = (curCandidate + minSize) / 2
- getCommonSubArrayLen(firstArr, secondArr, newH, curCandidate)
- }
- else -> {
- //Иначе искомый лежит где-то между предыдущим кондидатом и предыдущим
- val newH = (curCandidate + prevCandidate) / 2
- getCommonSubArrayLen(firstArr, secondArr, newH, prevCandidate)
- }
- }
- }
- /*
- * Проверяет, есть ли у массивов общий подмассив указанной длины
- * */
- private fun checkSubArrayExists(firstArr: List<Int>, secondArr: List<Int>, h: Int): Boolean {
- //Составляем сет из всевозможных подмакссивов
- val set = buildSet {
- for (i in 0..firstArr.size - h)
- add(firstArr.subList(i, i + h))
- }
- // Для каждого подмассива второго массива проверяем наличие в сете
- for (i in 0..secondArr.size - h) {
- if (secondArr.subList(i, i + h) in set)
- // Как только нашли хотя бы один, можно выходить
- return true
- }
- // Если перебрали все подмассивы и не вышли, то одинаковых подмассивов указанной длины нет
- return false
- }
- private fun BufferedReader.readResults(): List<Int> {
- val size = readLine().toInt()
- val tokenizer = StringTokenizer(readLine())
- return List(size) { tokenizer.nextToken().toInt() }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement