61 lines
1.5 KiB
Kotlin
61 lines
1.5 KiB
Kotlin
import kotlin.math.max
|
|
import kotlin.math.min
|
|
|
|
fun maxSplitDiscordance(s: String): Int {
|
|
val n = s.length
|
|
val dp = IntArray((n + 1) * (n + 1))
|
|
|
|
fun getLCS(i: Int, j: Int): Int { // where i and j means string index
|
|
return dp[(i + 1) * (n + 1) + (j + 1)]
|
|
}
|
|
|
|
fun setLCS(i: Int, j: Int, v: Int): Int {
|
|
dp[(i + 1) * (n + 1) + (j + 1)] = v
|
|
return v
|
|
}
|
|
|
|
var maxDiscordance = 0
|
|
var lcs: Int
|
|
val candidate = if (n % 2 == 0) {
|
|
listOf(n / 2)
|
|
} else {
|
|
listOf(n / 2, n / 2 + 1)
|
|
}
|
|
for (splitLoc in candidate) {
|
|
lcs = 0
|
|
for (x in 0 until splitLoc) {
|
|
setLCS(x, splitLoc - 1, 0)
|
|
}
|
|
|
|
|
|
for (i in 0 until splitLoc) {
|
|
for (j in splitLoc until n) {
|
|
|
|
if (s[i] == s[j]) {
|
|
lcs = max(setLCS(i, j, getLCS(i - 1, j - 1) + 1), lcs)
|
|
} else {
|
|
lcs = max(
|
|
setLCS(
|
|
i, j, max(
|
|
getLCS(i, j - 1),
|
|
getLCS(i - 1, j)
|
|
)
|
|
),
|
|
lcs
|
|
)
|
|
}
|
|
}
|
|
}
|
|
|
|
maxDiscordance = max(maxDiscordance, min(splitLoc, n - splitLoc) - lcs)
|
|
}
|
|
|
|
return maxDiscordance
|
|
|
|
}
|
|
|
|
fun main() {
|
|
val s = readln()
|
|
|
|
println(maxSplitDiscordance(s))
|
|
} |