很接近模板题的前缀和题。

首先,为了代码简洁易懂,我们使用一个函数change函数将不同字母转换成数字。然后定义数组a储存前缀和(1e4的访问次数用遍历肯定超时),此处注意a的长度要比字符串的长度大1,防止越界访问。再遍历一次字符串(注意字符串下标比数组下标小1),之后访问时只需要输出a[r]-a[l-1](不能是a[l],不然会多减一个数)就行了。

代码如下:

#include <bits/stdc++.h>
#include <cstdarg>
#include <sstream>
#include <vector>
using namespace std;
int change(char ch){
    if(ch=='P')return 3;
    else if(ch=='p')return 2;
    else if(ch=='G')return 1;
    else return 0;
}
int main() {
    string n;
    int q;
    cin>>n;
    cin>>q; 
    int len=n.length();
    stringstream ss;  //可以很快的输出
    vector<int>a(len+1,0);
    for(int i=1;i<=len;i++){
        a[i]+=a[i-1]+change(n[i-1]);
    }
    for(int i=0;i<q;i++){
        int x,y;
        cin>>x>>y;
        ss<<a[y]-a[x-1]<<"\n";
    }
    cout<<ss.str();
    return 0;
}