본문 바로가기

Coding Test

백준 16139 인간-컴퓨터 상호작용

https://www.acmicpc.net/problem/16139

 

16139번: 인간-컴퓨터 상호작용

첫 줄에 문자열 $S$가 주어진다. 문자열의 길이는 $200,000$자 이하이며 알파벳 소문자로만 구성되었다. 두 번째 줄에는 질문의 수 $q$가 주어지며, 문제의 수는 $1\leq q\leq 200,000$을 만족한다. 세 번째

www.acmicpc.net

 

#include <iostream>

using namespace std;


int prefix[26][200001];

int main() {

    ios::sync_with_stdio(false);
    cin.tie(NULL);
    cout.tie(NULL);


    string s;

    cin >> s;

    prefix[s[0] - 'a'][0] = 1;
    for (int i = 1; i < s.size(); i++) {
        for (int j = 0; j < 26; j++) {
            if (s[i] - 'a' == j) {
                prefix[j][i] = prefix[j][i - 1] + 1;
            } else {
                prefix[j][i] = prefix[j][i - 1];
            }
        }
    }

    int q;

    cin >> q;

    for (int qest = 0; qest < q; qest++) {

        char a;
        int l, r;

        cin >> a >> l >> r;

        if (l == 0) {
            cout << prefix[a - 'a'][r] << "\n";
        } else {
            cout << prefix[a - 'a'][r] - prefix[a - 'a'][l - 1] << "\n";
        }




    }


    return 0;
}

 

문자열의 최대 길이가 20만자나 되므로 전수조사를 했다간 시간초과가 난다.

 

20만자리의 문자열에 대해 각각의 알파벳의 개수의 누적합을 구한 후

주어지는 구간의 구간합을 계산한다.

'Coding Test' 카테고리의 다른 글

백준 15685 드래곤 커브  (1) 2024.03.28
백준 1277 발전소 설치  (0) 2024.03.27
백준 1774 우주신과의 교감  (0) 2024.03.25
백준 21919 소수 최소 공배수  (1) 2024.03.25
백준 17276 배열 돌리기  (1) 2024.03.23