白駿2037メール


質問する


右図のような携帯電話のキーボードがあります.このキーボードでプログラムを書くと、英語の情報を打つときに最小限の時間がかかります.

でも1番押すと空きがありますそしてACを打つなら、Aを打ってからしばらく待ってからCを打てばいいです.
文字を入力するには、ボタンを押す必要があります.ボタンを押すと、入力ボタンの文字が、ボタンを押すたびに次の文字に変換されます.例えば、2をA、2をB、3をCとする.連続してスペースを押すときは待たなくてもいいです.
入力
最初の行はpとwを与える.(1≦p,w≦1000)pはボタンを1回押すのに要する時間を示し,wはACと同じ数字の文字を連続して撮影するのを待つ時間を示す.次に、2行目に書く文字列が表示されます.ただし、文字列の長さは1000未満であり、一番前と一番後ろにスペースがないと仮定できます.文字列は大文字とスペースのみで構成されます.
しゅつりょく
最初の行にメッセージを書くのに要する時間を出力します.
入力例1
2 10
ABBAS SALAM
サンプル出力1
72

解法


まず,キーのリストでは,そのボタン上の文字を文字列で囲んで生成する.
前のキーを表す変数prevは、意味のない文字に初期化される.
文字列の各文字を繰り返し入力します.
各キーのリストで各キーを繰り返します.
現在の文字がキーにある場合、前の文字もキーにあります.
両方が空白文字の場合、pが蓄積されます.
そうでなければ、wを蓄積し、キーのsの位置インデックスに1を加え、pを乗じて蓄積する.
前の文字と現在の文字が1つのキーで重複していない場合、そのキーの現在の文字の位置に1を加算し、p累積を乗算します.
繰り返し終了するたびに、前の文字が現在の文字に更新されます.
2番目のプールは、入力した文字列を1文字ずつ繰り返す仕上げです.
現在の文字が空白の場合、pが直接蓄積されます.
そうでなければ、キーのリストを繰り返します.このリストには空白の字が落ちている.
繰り返しの場合、現在の文字がキーの文字列に存在する場合、その文字の位置に1を加え、p累積を乗算します.
ここで、前の文字が現在のキーに存在する場合、wもさらに蓄積される.
現在の文字が置かれているキーが見つかり、重複文を終了します.
古いテキストを現在のテキストに更新します.

コード1

p, w = map(int, input().split())
S = input()
keys = [' ', 'ABC', 'DEF', 'GHI', 'JKL', 'MNO', 'PQRS', 'TUV', 'WXYZ']
result = 0
prev = '_'

for s in S:
    for key in keys:
        if s in key and prev in key:
            if s == key == ' ':
                result += p
            else:
                result += w
                result += (key.index(s) + 1) * p
            break
        elif s in key:
            result += (key.index(s) + 1) * p
            break
    prev = s

print(result)

コード2

p, w = map(int, input().split())
S = input()
keys = ['ABC', 'DEF', 'GHI', 'JKL', 'MNO', 'PQRS', 'TUV', 'WXYZ']
result, prev = 0, '_'

for s in S:
    if s == ' ':
        result += p
    else:
        for key in keys:
            if s in key:
                result += p * (key.index(s) + 1)
                if prev in key:
                    result += w
                break
    prev = s

print(result)
白駿2037メール