Submission #65957456


Source Code Expand

import java.util.*
import kotlin.math.round
import kotlin.random.Random

@Suppress("unused")
fun next() = readln()

@Suppress("unused")
fun nextInt() = next().toInt()

@Suppress("unused")
fun nextLong() = next().toLong()

@Suppress("unused")
fun nextDouble() = next().toDouble()

@Suppress("unused")
fun nextList() = next().split(" ")

@Suppress("unused")
fun nextIntList() = next().split(" ").map { it.toInt() }

@Suppress("unused")
fun nextLongList() = next().split(" ").map { it.toLong() }

@Suppress("unused")
fun nextDoubleList() = next().split(" ").map { it.toDouble() }

const val ALPHABET = 6
val CHAR_TO_IDX = mapOf('a' to 0, 'b' to 1, 'c' to 2, 'd' to 3, 'e' to 4, 'f' to 5)

fun main() {
    val (N, M, _) = nextIntList()
    val spList = Array(N) { SP("", 0) }
    for (i in spList.indices) {
        val (s, p) = next().split(" ")
        spList[i] = SP(s, p.toInt())
    }


    val sorted = spList.sortedByDescending { it.p }.take(3)
    val probList = Array(M) { Prob('a', IntArray(M)) }

    val A = Array(M) { IntArray(M) }

    val countAlphabet = BooleanArray(6) { false }
    for (i in sorted.indices) {
        val s = sorted[i].s
        val p = sorted[i].p
        var previous = s[0] - 'a'
        for (i in 0 until s.length - 1) {
            var next = s[i + 1] - 'a'
            if (countAlphabet[next]) {
                countAlphabet[next] = false
                next += 6
            } else {
                countAlphabet[next] = true
            }
            A[previous][next] += (p / 3)
            previous = next
        }
    }

    var c = 'a'
    for (i in A.indices) {
        val sum = A[i].sum()
        if (sum != 0) {
            for (j in A[i].indices) {
                A[i][j] = (A[i][j] * 100) / sum
            }
            var newSum = A[i].sum()
            if (newSum != 100) {
                for (j in A[i].indices) {
                    if (A[i][j] == 0) {
                        continue
                    }
                    A[i][j]++
                    newSum++
                    if (newSum == 100) {
                        break
                    }
                }
            }
        } else {
            A[i][0] = 100
        }
        probList[i] = Prob(c, A[i])
        if (c == 'f') {
            c = 'a'
        } else {
            c++
        }
    }

    val S = probList.map { it.c }.toCharArray()
    var score = 0
    for (sp in spList) {
        var count = 0
        // 100文字分を実際に100回生成して、
        for (i in 0 until 100) {
            val sb = StringBuilder()
            var now = 0
            for (j in 0 until 100) {
                sb.append(S[now])
                var acc = 0
                val r = Random.nextInt(100)
                for (k in A[now].indices) {
                    acc += A[now][k]
                    if (acc > r) {
                        now = k
                        break
                    }
                }
            }
            if (sb.contains(sp.s)) {
                count++
            }
        }

        score += round((count.toDouble() / 100) * sp.p).toInt()
    }

    for (p in probList) {
        println("${p.c} ${p.a.joinToString(" ")}")
    }
}

data class SP(val s: String, val p: Int)
class Prob(val c: Char, val a: IntArray)

// --- Aho-Corasick実装 ---
class AhoCorasick {
    val root = 0
    var size = 1
    val to = Array(1000) { IntArray(ALPHABET) { -1 } }
    val fail = IntArray(1000) { 0 }
    val output = Array(1000) { mutableListOf<Int>() }

    fun add(s: String, id: Int) {
        var v = root
        for (ch in s) {
            val c = CHAR_TO_IDX[ch]!!
            if (to[v][c] == -1) to[v][c] = size++
            v = to[v][c]
        }
        output[v].add(id)
    }

    fun build() {
        val q: Queue<Int> = LinkedList()
        for (c in 0 until ALPHABET) {
            if (to[root][c] != -1) {
                q.add(to[root][c])
                fail[to[root][c]] = root
            } else {
                to[root][c] = root
            }
        }
        while (q.isNotEmpty()) {
            val v = q.poll()
            for (c in 0 until ALPHABET) {
                val u = to[v][c]
                if (u == -1) continue
                var f = fail[v]
                while (to[f][c] == -1) f = fail[f]
                fail[u] = to[f][c]
                output[u].addAll(output[fail[u]])
                q.add(u)
            }
        }
    }
}

Submission Info

Submission Time
Task A - Lovely Language Model
User MelVouivre
Language Kotlin (Kotlin/JVM 1.8.20)
Score 3960028
Code Size 4627 Byte
Status AC
Exec Time 242 ms
Memory 52636 KiB

Compile Error

Main.kt:51:14: warning: name shadowed: i
        for (i in 0 until s.length - 1) {
             ^

Judge Result

Set Name test_ALL
Score / Max Score 3960028 / 150000000
Status
AC × 150
Set Name Test Cases
test_ALL test_0000.txt, test_0001.txt, test_0002.txt, test_0003.txt, test_0004.txt, test_0005.txt, test_0006.txt, test_0007.txt, test_0008.txt, test_0009.txt, test_0010.txt, test_0011.txt, test_0012.txt, test_0013.txt, test_0014.txt, test_0015.txt, test_0016.txt, test_0017.txt, test_0018.txt, test_0019.txt, test_0020.txt, test_0021.txt, test_0022.txt, test_0023.txt, test_0024.txt, test_0025.txt, test_0026.txt, test_0027.txt, test_0028.txt, test_0029.txt, test_0030.txt, test_0031.txt, test_0032.txt, test_0033.txt, test_0034.txt, test_0035.txt, test_0036.txt, test_0037.txt, test_0038.txt, test_0039.txt, test_0040.txt, test_0041.txt, test_0042.txt, test_0043.txt, test_0044.txt, test_0045.txt, test_0046.txt, test_0047.txt, test_0048.txt, test_0049.txt, test_0050.txt, test_0051.txt, test_0052.txt, test_0053.txt, test_0054.txt, test_0055.txt, test_0056.txt, test_0057.txt, test_0058.txt, test_0059.txt, test_0060.txt, test_0061.txt, test_0062.txt, test_0063.txt, test_0064.txt, test_0065.txt, test_0066.txt, test_0067.txt, test_0068.txt, test_0069.txt, test_0070.txt, test_0071.txt, test_0072.txt, test_0073.txt, test_0074.txt, test_0075.txt, test_0076.txt, test_0077.txt, test_0078.txt, test_0079.txt, test_0080.txt, test_0081.txt, test_0082.txt, test_0083.txt, test_0084.txt, test_0085.txt, test_0086.txt, test_0087.txt, test_0088.txt, test_0089.txt, test_0090.txt, test_0091.txt, test_0092.txt, test_0093.txt, test_0094.txt, test_0095.txt, test_0096.txt, test_0097.txt, test_0098.txt, test_0099.txt, test_0100.txt, test_0101.txt, test_0102.txt, test_0103.txt, test_0104.txt, test_0105.txt, test_0106.txt, test_0107.txt, test_0108.txt, test_0109.txt, test_0110.txt, test_0111.txt, test_0112.txt, test_0113.txt, test_0114.txt, test_0115.txt, test_0116.txt, test_0117.txt, test_0118.txt, test_0119.txt, test_0120.txt, test_0121.txt, test_0122.txt, test_0123.txt, test_0124.txt, test_0125.txt, test_0126.txt, test_0127.txt, test_0128.txt, test_0129.txt, test_0130.txt, test_0131.txt, test_0132.txt, test_0133.txt, test_0134.txt, test_0135.txt, test_0136.txt, test_0137.txt, test_0138.txt, test_0139.txt, test_0140.txt, test_0141.txt, test_0142.txt, test_0143.txt, test_0144.txt, test_0145.txt, test_0146.txt, test_0147.txt, test_0148.txt, test_0149.txt
Case Name Status Exec Time Memory
test_0000.txt AC 196 ms 49720 KiB
test_0001.txt AC 189 ms 49464 KiB
test_0002.txt AC 193 ms 49600 KiB
test_0003.txt AC 209 ms 51332 KiB
test_0004.txt AC 219 ms 51676 KiB
test_0005.txt AC 183 ms 49412 KiB
test_0006.txt AC 221 ms 52636 KiB
test_0007.txt AC 209 ms 49720 KiB
test_0008.txt AC 212 ms 51540 KiB
test_0009.txt AC 204 ms 49500 KiB
test_0010.txt AC 215 ms 51932 KiB
test_0011.txt AC 225 ms 51828 KiB
test_0012.txt AC 187 ms 49480 KiB
test_0013.txt AC 195 ms 49680 KiB
test_0014.txt AC 220 ms 51316 KiB
test_0015.txt AC 194 ms 49472 KiB
test_0016.txt AC 212 ms 51396 KiB
test_0017.txt AC 194 ms 49480 KiB
test_0018.txt AC 192 ms 49448 KiB
test_0019.txt AC 189 ms 49416 KiB
test_0020.txt AC 204 ms 51708 KiB
test_0021.txt AC 224 ms 51984 KiB
test_0022.txt AC 210 ms 49712 KiB
test_0023.txt AC 229 ms 51884 KiB
test_0024.txt AC 190 ms 49536 KiB
test_0025.txt AC 190 ms 49516 KiB
test_0026.txt AC 216 ms 51760 KiB
test_0027.txt AC 200 ms 49764 KiB
test_0028.txt AC 215 ms 51880 KiB
test_0029.txt AC 196 ms 49516 KiB
test_0030.txt AC 192 ms 49680 KiB
test_0031.txt AC 237 ms 51712 KiB
test_0032.txt AC 185 ms 49312 KiB
test_0033.txt AC 209 ms 51800 KiB
test_0034.txt AC 196 ms 49396 KiB
test_0035.txt AC 211 ms 51800 KiB
test_0036.txt AC 193 ms 49524 KiB
test_0037.txt AC 207 ms 49488 KiB
test_0038.txt AC 200 ms 49536 KiB
test_0039.txt AC 191 ms 49304 KiB
test_0040.txt AC 218 ms 51480 KiB
test_0041.txt AC 217 ms 51424 KiB
test_0042.txt AC 212 ms 51732 KiB
test_0043.txt AC 225 ms 51244 KiB
test_0044.txt AC 221 ms 49916 KiB
test_0045.txt AC 188 ms 49444 KiB
test_0046.txt AC 217 ms 51756 KiB
test_0047.txt AC 225 ms 49664 KiB
test_0048.txt AC 213 ms 51652 KiB
test_0049.txt AC 223 ms 51548 KiB
test_0050.txt AC 192 ms 49380 KiB
test_0051.txt AC 187 ms 49392 KiB
test_0052.txt AC 213 ms 51636 KiB
test_0053.txt AC 210 ms 51724 KiB
test_0054.txt AC 232 ms 51580 KiB
test_0055.txt AC 191 ms 49504 KiB
test_0056.txt AC 215 ms 51840 KiB
test_0057.txt AC 190 ms 49236 KiB
test_0058.txt AC 188 ms 49492 KiB
test_0059.txt AC 193 ms 49460 KiB
test_0060.txt AC 189 ms 49524 KiB
test_0061.txt AC 221 ms 51656 KiB
test_0062.txt AC 215 ms 51704 KiB
test_0063.txt AC 221 ms 51724 KiB
test_0064.txt AC 190 ms 49628 KiB
test_0065.txt AC 193 ms 49616 KiB
test_0066.txt AC 189 ms 49500 KiB
test_0067.txt AC 201 ms 50560 KiB
test_0068.txt AC 190 ms 49288 KiB
test_0069.txt AC 200 ms 49472 KiB
test_0070.txt AC 214 ms 51728 KiB
test_0071.txt AC 194 ms 49660 KiB
test_0072.txt AC 208 ms 52144 KiB
test_0073.txt AC 196 ms 50228 KiB
test_0074.txt AC 209 ms 51812 KiB
test_0075.txt AC 225 ms 51508 KiB
test_0076.txt AC 191 ms 49264 KiB
test_0077.txt AC 188 ms 49112 KiB
test_0078.txt AC 223 ms 51840 KiB
test_0079.txt AC 216 ms 51640 KiB
test_0080.txt AC 214 ms 51756 KiB
test_0081.txt AC 216 ms 51756 KiB
test_0082.txt AC 191 ms 49392 KiB
test_0083.txt AC 200 ms 49776 KiB
test_0084.txt AC 223 ms 51320 KiB
test_0085.txt AC 200 ms 49724 KiB
test_0086.txt AC 199 ms 49388 KiB
test_0087.txt AC 193 ms 49292 KiB
test_0088.txt AC 227 ms 50700 KiB
test_0089.txt AC 193 ms 49496 KiB
test_0090.txt AC 189 ms 49476 KiB
test_0091.txt AC 219 ms 51184 KiB
test_0092.txt AC 194 ms 49580 KiB
test_0093.txt AC 194 ms 49700 KiB
test_0094.txt AC 190 ms 49280 KiB
test_0095.txt AC 230 ms 52124 KiB
test_0096.txt AC 214 ms 51328 KiB
test_0097.txt AC 204 ms 51144 KiB
test_0098.txt AC 196 ms 49592 KiB
test_0099.txt AC 235 ms 51828 KiB
test_0100.txt AC 196 ms 49412 KiB
test_0101.txt AC 198 ms 49268 KiB
test_0102.txt AC 228 ms 52064 KiB
test_0103.txt AC 211 ms 51752 KiB
test_0104.txt AC 225 ms 51820 KiB
test_0105.txt AC 194 ms 49480 KiB
test_0106.txt AC 195 ms 49520 KiB
test_0107.txt AC 190 ms 49528 KiB
test_0108.txt AC 207 ms 51584 KiB
test_0109.txt AC 192 ms 49780 KiB
test_0110.txt AC 216 ms 51632 KiB
test_0111.txt AC 226 ms 50780 KiB
test_0112.txt AC 192 ms 49420 KiB
test_0113.txt AC 225 ms 50924 KiB
test_0114.txt AC 215 ms 51524 KiB
test_0115.txt AC 189 ms 49296 KiB
test_0116.txt AC 194 ms 49468 KiB
test_0117.txt AC 181 ms 49296 KiB
test_0118.txt AC 226 ms 51624 KiB
test_0119.txt AC 218 ms 51164 KiB
test_0120.txt AC 191 ms 49464 KiB
test_0121.txt AC 194 ms 49408 KiB
test_0122.txt AC 242 ms 50744 KiB
test_0123.txt AC 188 ms 49700 KiB
test_0124.txt AC 214 ms 51916 KiB
test_0125.txt AC 223 ms 51704 KiB
test_0126.txt AC 197 ms 49556 KiB
test_0127.txt AC 213 ms 51828 KiB
test_0128.txt AC 195 ms 49672 KiB
test_0129.txt AC 223 ms 51348 KiB
test_0130.txt AC 192 ms 49460 KiB
test_0131.txt AC 225 ms 51864 KiB
test_0132.txt AC 187 ms 52084 KiB
test_0133.txt AC 217 ms 51712 KiB
test_0134.txt AC 197 ms 49568 KiB
test_0135.txt AC 218 ms 51960 KiB
test_0136.txt AC 192 ms 49696 KiB
test_0137.txt AC 196 ms 49508 KiB
test_0138.txt AC 211 ms 51508 KiB
test_0139.txt AC 197 ms 49576 KiB
test_0140.txt AC 197 ms 49492 KiB
test_0141.txt AC 203 ms 49300 KiB
test_0142.txt AC 212 ms 51880 KiB
test_0143.txt AC 198 ms 49324 KiB
test_0144.txt AC 192 ms 49332 KiB
test_0145.txt AC 202 ms 49752 KiB
test_0146.txt AC 218 ms 52380 KiB
test_0147.txt AC 185 ms 49324 KiB
test_0148.txt AC 195 ms 49608 KiB
test_0149.txt AC 195 ms 49292 KiB