https://www.acmicpc.net/problem/16139
16139번: 인간-컴퓨터 상호작용
첫 줄에 문자열 $S$가 주어진다. 문자열의 길이는 $200,000$자 이하이며 알파벳 소문자로만 구성되었다. 두 번째 줄에는 질문의 수 $q$가 주어지며, 문제의 수는 $1\leq q\leq 200,000$을 만족한다. 세 번째
www.acmicpc.net
2차원 배열 누적합 문제이다.
알고리즘은 맞았는데 마지막에서 삽질해서 시간이 조금 걸렸다.
S[i][j] : 0~i까지 알파벳 j의 누적합
으로 설정했다.
알파벳 j는 입력을 받은 후 아스키 코드에 맞춰 97을 빼주고 계산하였다.
누적합을 구하는 건 금방했는데, 구간별 누적합을 구하는 데에 오랜 시간이 걸렸다.
l이 들어올 때 0이면 처음부터 탐색하는 것이므로 l=0,
0보다 크면 S[l-1][index]로 설정하였다.
전체 코드는 아래에 있다.
#include <iostream>
#include <string>
using namespace std;
string A;
int S[200001][26];
// S[i][j] : 0~i까지 알파벳 j의 누적합
int q;
int main() {
ios_base::sync_with_stdio(false);
cin.tie(NULL);
cout.tie(NULL);
cin >> A;
for (int i = 0; i < A.length(); i++) {
int j = A[i] - 97;
if (i != 0) {
for (int k = 0; k < 26; k++) {
S[i][k] = S[i - 1][k];
}
}
S[i][j]++;
}
cin >> q;
for (int i = 0; i < q; i++) {
char input; int r, l;
cin >> input;
cin >> l >> r;
int index = input - 97;
int large = S[r][index];
int small = (l > 0) ? S[l - 1][index] : 0; // 0부터 시작하면 첫 부분부터 탐색하는 것임
printf("%d\n", large - small);
}
}
'백준' 카테고리의 다른 글
[9012] 괄호 (0) | 2023.01.17 |
---|---|
[10986] 나머지 합 (0) | 2023.01.16 |
[25682] 체스판 다시 칠하기 2 (0) | 2023.01.11 |
[11660] 구간 합 구하기 5 (0) | 2023.01.09 |
[2559] 수열 (0) | 2023.01.08 |
댓글