누적 합 문제이다. 알파벳 개수인 26개의 누적 합을 해주면 된다. 문자열을 돌며 같은 알파벳일 경우 이전의 합에 1을 증가시켜주고 아닐 시 그대로 가져오면 된다.
#include <iostream>
#include <string>
using namespace std;
int prefix[200001][26], q, l, r;
string str;
char c;
int main()
{
ios::sync_with_stdio(0), cin.tie(0);
cin >> str;
++prefix[0][str[0] - 'a'];
for (int i = 1; i < str.length(); ++i)
{
int k = str[i] - 'a';
for (int j = 0; j < 26; ++j)
{
if (k != j)
prefix[i][j] = prefix[i - 1][j];
else
prefix[i][j] = prefix[i - 1][j] + 1;
}
}
cin >> q;
while (q--)
{
cin >> c >> l >> r;
int alpha = c - 'a', sum;
if (l != 0)
sum = prefix[r][alpha] - prefix[l - 1][alpha];
else
sum = prefix[r][alpha];
cout << sum << "\n";
}
return 0;
}
누적 합에 대해 알고 있다면 쉽게 풀 수 있다. 문자의 첫 번째의 경우 이전의 값이 없기에 알파벳에 맞게 바로 증가 시켜주면 된다.