ABC122 C - GeT AC
備忘録
問題
回答
import sys import os import math ii = lambda: int(sys.stdin.buffer.readline().rstrip()) il = lambda: list(map(int, sys.stdin.buffer.readline().split())) fl = lambda: list(map(float, sys.stdin.buffer.readline().split())) iln = lambda n: [int(sys.stdin.buffer.readline().rstrip()) for _ in range(n)] iss = lambda: sys.stdin.buffer.readline().decode().rstrip() sl = lambda: list(map(str, sys.stdin.buffer.readline().decode().split())) isn = lambda n: [sys.stdin.buffer.readline().decode().rstrip() for _ in range(n)] MOD = 10 ** 9 + 7 def main(): if os.getenv("LOCAL"): sys.stdin = open("input.txt", "r") N, Q = il() S = iss() ret = [0] * N for n in range(N - 1): if S[n] == 'A' and S[n + 1] == 'C': ret[n] += ret[n - 1] + 1 else: ret[n] += ret[n - 1] for _ in range(Q): l, r = il() print(ret[r - 2] - ret[l - 2]) if __name__ == '__main__': main()
考え方
探索を行う問いQ
は最大10 ** 5
個出題される。
そのため、全ての問のl, r
に対してslice
とcount
を行うと、TLE
になる。
Submission #11777983 - AtCoder Beginner Contest 122
高速化を行うために、
長さN
の文字列S
に対して、0
番目からN-1
番目までに、
その時点までのAC
の数をあらかじめカウントした配列を作成しておく。
AC
の数をカウントした配列のr
番目からl
番目を引くことで、
文字列S
のl ~ r
までの範囲内にいくつのAC
が存在しているか求めることが出来る。
イメージとしては累積和に近い?