白駿16139号ヒューマンマシンインタラクション


質問する



インプット



50分溶液

import sys

input = sys.stdin.readline

name = input().strip()
n = int(input())
for i in range(n):
    a = input().split()
    sum = 0
    for j in range(int(a[1]), int(a[2]) + 1):
        if name[j] == a[0]:
            sum += 1
    print(sum)
2つの繰り返し文を無知に使うだけ
20*20*20時間の複雑さで十分だと思います.
50点取った

100点

import sys

input = sys.stdin.readline

name = input().strip()
n = int(input())
arr = [[0 for i in range(26)] for i in range(len(name))]
arr[0][ord(name[0]) - 97] = 1
for i in range(1, len(name)):
    arr[i][ord(name[i]) - 97] = 1
    for j in range(26):
        arr[i][j] += arr[i - 1][j]
for i in range(n):
    a = input().split()
    if int(a[1]) > 0:
        res = arr[int(
            a[2])][ord(a[0]) - 97] - arr[int(a[1]) - 1][ord(a[0]) - 97]
    else:
        res = arr[int(a[2])][ord(a[0]) - 97]
    print(res)

#26개

説明:


累加して問題を解く.
26個の小文字a~zの2次元配列を作成する
a~zをAskyコードに変換すると-97は0~25になります
arr[i][j]+=arr[i-1][j]+現在のi位置のアルファベットAskyコード-97もあります
ゼロから最後までいくつか積算し、すべて2次元配列に入れます.
だからi~jからいくつかのアルファベットを確定するにはarr[i][askii] - ar[j-1][askii]i~jの1番目のアルファベットaskiiの個数がわかる.

例外処理


0からi番斎ならarr[i][askii]-0