Advertisement
vkazar

Untitled

Oct 23rd, 2023
98
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Kotlin 3.30 KB | None | 0 0
  1. package sprint4.tasks.I
  2.  
  3. import java.io.BufferedReader
  4. import java.io.InputStreamReader
  5. import java.util.*
  6. import kotlin.math.min
  7.  
  8. fun main() {
  9.  
  10.     val bufferedReader = BufferedReader(InputStreamReader(System.`in`))
  11.     val firstArr = bufferedReader.readResults()
  12.     val secondArr = bufferedReader.readResults()
  13.     // Одинаковая последовательность не может быть больше минимальной из длин массивов
  14.     // Поэтому первым делом проверяем эту длину
  15.     val h = getCommonSubArrayLen(firstArr, secondArr, min(firstArr.size, secondArr.size))
  16.     println(h)
  17. }
  18.  
  19. private fun getCommonSubArrayLen(
  20.     firstArr: List<Int>,
  21.     secondArr: List<Int>,
  22.     curCandidate: Int,
  23.     //Изначально кандидатов нет, так что заглушим его
  24.     prevCandidate: Int = 0
  25. ): Int {
  26.     // По алгоритму мы сужаем поиск, поэтому текущий кандидат не может стать меньше или даже равным предыдущему
  27.     if (curCandidate <= prevCandidate) return prevCandidate
  28.  
  29.     return when (checkSubArrayExists(firstArr, secondArr, curCandidate)) {
  30.         true -> {
  31.             // Если текущий кандидат нам подходит (есть одинаковые подмассивы указанной длины
  32.             // То рекурсивно ищем справа от него: искомый будет не меньше текущего и не больше минимальной длины двух оригинальных массивов
  33.             val minSize = min(firstArr.size, secondArr.size)
  34.             val newH = (curCandidate + minSize) / 2
  35.             getCommonSubArrayLen(firstArr, secondArr, newH, curCandidate)
  36.         }
  37.         else -> {
  38.             //Иначе искомый лежит где-то между предыдущим кондидатом и предыдущим
  39.             val newH = (curCandidate + prevCandidate) / 2
  40.             getCommonSubArrayLen(firstArr, secondArr, newH, prevCandidate)
  41.         }
  42.     }
  43. }
  44.  
  45. /*
  46. * Проверяет, есть ли у массивов общий подмассив указанной длины
  47. * */
  48. private fun checkSubArrayExists(firstArr: List<Int>, secondArr: List<Int>, h: Int): Boolean {
  49.     //Составляем сет из всевозможных подмакссивов
  50.     val set = buildSet {
  51.         for (i in 0..firstArr.size - h)
  52.             add(firstArr.subList(i, i + h))
  53.     }
  54.     // Для каждого подмассива второго массива проверяем наличие в сете
  55.     for (i in 0..secondArr.size - h) {
  56.         if (secondArr.subList(i, i + h) in set)
  57.             // Как только нашли хотя бы один, можно выходить
  58.             return true
  59.     }
  60.     // Если перебрали все подмассивы и не вышли, то одинаковых подмассивов указанной длины нет
  61.     return false
  62. }
  63.  
  64. private fun BufferedReader.readResults(): List<Int> {
  65.     val size = readLine().toInt()
  66.     val tokenizer = StringTokenizer(readLine())
  67.     return List(size) { tokenizer.nextToken().toInt() }
  68. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement