1일1알

백준 16139번 인간-컴퓨터 상호작용 C++ 본문

알고리즘

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

영춘권의달인 2022. 12. 2. 12:30

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

 

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

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

www.acmicpc.net

 

알파벳별로 누적합을 저장해서 풀었다.

 

#include <iostream>
#include <string>
#include <vector>
#include <math.h>
#include <algorithm>
#include <utility>
#include <stack>
#include <queue>
#include <math.h>
#include <set>
#include <map>
#include <list>
#include <unordered_map>
#include <unordered_set>
#include <iomanip>
#include <limits.h>

using namespace std;
using int64 = long long;

vector<vector<int>> accSum;

int main() {
    ios_base::sync_with_stdio(false);
    cin.tie(NULL);
    cout.tie(NULL);

    string str;
    cin >> str;
    accSum = vector<vector<int>>(26, vector<int>(str.length(), 0));
    char firstC = str[0];
    accSum[firstC - 'a'][0] = 1;
    for (int i = 1; i < str.length(); i++) {
        int idx = str[i] - 'a';
        for (int j = 0; j < 26; j++) {
            accSum[j][i] = accSum[j][i - 1];
            if (idx == j) accSum[j][i]++;
        }
    }
    int q;
    cin >> q;
    for (int i = 0; i < q; i++) {
        char c;
        int l, r;
        cin >> c >> l >> r;
        int idx = c - 'a';
        int ans;
        if (l == 0) {
            ans = accSum[idx][r];
        }
        else {
            ans = accSum[idx][r] - accSum[idx][l - 1];
        }
        cout << ans << "\n";
    }
}