알고리즘
백준 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";
}
}