https://coderun.yandex.ru/problem/fair-division Средняя

Решение

import java.io.BufferedReader
import java.io.InputStreamReader
import java.io.BufferedWriter
import java.io.OutputStreamWriter

fun main() {
    val reader = BufferedReader(InputStreamReader(System.`in`))
    val writer = BufferedWriter(OutputStreamWriter(System.out))

    val s = reader.readLine()!!
    val n = s.length

    val prefix = Array(26) { IntArray(n + 1) }
    for (i in 0 until n) {
        val ci = s[i] - 'a'
        for (c in 0 until 26) {
            prefix[c][i + 1] = prefix[c][i]
        }
        prefix[ci][i + 1]++
    }

    val divisors = mutableListOf<Int>()
    var x = 1
    while (x * x <= n) {
        if (n % x == 0) {
            divisors.add(x)
            if (x != n / x) divisors.add(n / x)
        }
        x++
    }
    divisors.sortDescending()

    var answer = 1
    outer@ for (k in divisors) {
        if (k == 1) {
            answer = 1
            break
        }
        val len = n / k
        for (c in 0 until 26) {
            if (prefix[c][n] % k != 0) continue@outer
        }
        val baseCount = IntArray(26) { prefix[it][len] }
        for (j in 1 until k) {
            val start = j * len
            val end = start + len
            for (c in 0 until 26) {
                if (prefix[c][end] - prefix[c][start] != baseCount[c]) {
                    continue@outer
                }
            }
        }
        answer = k
        break@outer
    }

    writer.write(answer.toString())
    writer.newLine()
    writer.flush()
    reader.close()
    writer.close()
}