提出 #3658086


ソースコード 拡げる

import java.io.BufferedReader
import java.io.InputStreamReader

class C

fun main( args: Array<String> ) {
    val st = BufferedReader( InputStreamReader( System.`in` ) )
    val n = st.nextInt()
    val s = st.readLine()
    val q = st.nextInt()
    val len = run {
        val list = st.nextInts().toMutableList()
        list.add( 3 )
        return@run list.toIntArray()
    }
    val p = Array( len.size, { it } )
    p.sortBy { len[it] }
    val r = LongArray( len.size )
    r[p[0]] = run {
        var cnt = 0L
        for ( i in 0 .. s.length - 3 ) {
            if ( s[i] == 'D' && s[i + 1] == 'M' && s[i + 2] == 'C' ) {
                cnt ++
            }
        }
        return@run cnt
    }
    val mCount = run {
        val tmp = LongArray( n + 1 )
        for ( i in s.indices ) {
            tmp[i + 1] = tmp[i] + if ( s[i] == 'M' ) 1 else 0
        }
        return@run tmp
    }
    val cCount = run {
        val tmp = LongArray( n + 1 )
        for ( i in s.indices ) {
            tmp[i + 1] = tmp[i] + if ( s[i] == 'C' ) 1 else 0
        }
        return@run tmp
    }

    for ( i in 1 until p.size ) {
        r[p[i]] = r[p[i - 1]]
        if ( len[p[i]] == len[p[i - 1]] ) {
            continue
        }

        val pairs = LongArray( s.length + 1 )
        run {
            val l = len[p[i]] - len[p[i - 1]]
            var mc = 0L
            var cc = 0L
            for ( j in s.indices.reversed() ) {
                if ( j < s.lastIndex ) pairs[j] = pairs[j + 1]
                if ( j + l < s.length ) {
                    if ( s[j + l] == 'C' ) {
                        pairs[j] -= mc
                        cc --
                    }
                    if ( s[j + l] == 'M' ) {
                        mc --
                    }
                }
                if ( s[j] == 'M' ) {
                    pairs[j] += cc
                    mc ++
                }
                if ( s[j] == 'C' ) {
                    cc ++
                }
            }
        }

        for ( j in 0 .. s.length - len[p[i - 1]] ) {
            if ( s[j] != 'D' ) continue
            r[p[i]] += ( mCount[j + len[p[i - 1]]] - mCount[j] ) * ( cCount[Math.min( cCount.lastIndex, j + len[p[i]] )] - cCount[j + len[p[i - 1]]] )
            r[p[i]] += pairs[j + len[p[i - 1]]]
        }
    }
    for ( i in 0 until q ) {
        println( r[i] )
    }
}

private fun BufferedReader.nextInt(): Int {
    return readLine().toInt()
}

private fun BufferedReader.nextInts(): IntArray {
    val s = readLine().split( " " )
    return IntArray( s.size, { s[it].toInt() } )
}

提出情報

提出日時
問題 C - k-DMC
ユーザ Chushuhuch
言語 Kotlin (1.0.0)
得点 600
コード長 2693 Byte
結果 AC
実行時間 1837 ms
メモリ 284992 KiB

ジャッジ結果

セット名 All
得点 / 配点 600 / 600
結果
AC × 23
セット名 テストケース
All dmc-dmc-00, dmc-dmc-01, dmc-dmc-02, dmc-dmc-03, dmc-dmc-04, dmc-large-00, dmc-large-01, dmc-large-02, dmc-large-03, dmc-large-04, dmc-random-00, dmc-random-01, dmc-random-02, dmc-random-03, dmc-random-04, dmc-special-00, dmc-special-01, dmc-special-02, dmc-special-03, sample_01, sample_02, sample_03, sample_04
ケース名 結果 実行時間 メモリ
dmc-dmc-00 AC 1798 ms 272312 KiB
dmc-dmc-01 AC 1837 ms 272112 KiB
dmc-dmc-02 AC 1799 ms 272408 KiB
dmc-dmc-03 AC 1831 ms 272308 KiB
dmc-dmc-04 AC 1828 ms 274224 KiB
dmc-large-00 AC 1098 ms 273804 KiB
dmc-large-01 AC 1098 ms 267256 KiB
dmc-large-02 AC 1135 ms 272780 KiB
dmc-large-03 AC 1115 ms 273272 KiB
dmc-large-04 AC 1140 ms 274600 KiB
dmc-random-00 AC 980 ms 284992 KiB
dmc-random-01 AC 887 ms 234796 KiB
dmc-random-02 AC 792 ms 275216 KiB
dmc-random-03 AC 702 ms 244412 KiB
dmc-random-04 AC 629 ms 228724 KiB
dmc-special-00 AC 974 ms 267380 KiB
dmc-special-01 AC 1094 ms 273420 KiB
dmc-special-02 AC 1054 ms 274688 KiB
dmc-special-03 AC 976 ms 265996 KiB
sample_01 AC 214 ms 33864 KiB
sample_02 AC 211 ms 33868 KiB
sample_03 AC 210 ms 35696 KiB
sample_04 AC 210 ms 33732 KiB