很接近模板题的前缀和题。
首先,为了代码简洁易懂,我们使用一个函数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;
}

京公网安备 11010502036488号