首页 > 试题广场 >

舞萌时间到!

[编程题]舞萌时间到!
  • 热度指数:52 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 256M,其他语言512M
  • 算法知识视频讲解
\hspace{15pt}在舞萌 DX 中,对应判定 `P`,`p`,`G`,`g`,`m` 的 dx 分分别为 3,2,1,0,0。给定旺仔哥哥一次玩舞萌的判定序列字符串 s,长度为 |s|,其中第 i 个字符表示旺仔哥哥第 i 次敲击音符时得到的判定结果。

\hspace{15pt}现有 q 次询问,每次给出区间 [l,r],求此区间内的 dx 分总和。

输入描述:
\hspace{15pt}第一行输入一个字符串 s\ (1\le |s|\le 10^6),仅由 `P`,`p`,`G`,`g`,`m`这五种字符构成; 
\hspace{15pt}第二行输入一个整数 q\ (1\le q\le 10^4)
\hspace{15pt}接下来的 q 行,每行输入两个整数 l,r\ (1\le l\le r\le |s|)


输出描述:
\hspace{15pt}按询问顺序输出 q 行,每行一个整数,表示对应区间的 dx 分总和。
示例1

输入

GPPmGmGGGp
10
2 4
3 7
2 7
3 5
3 7
7 9
6 7
2 5
6 6
2 8

输出

6
5
8
4
5
3
1
7
0
9
#include <ios>
#include <iostream>
#include <bits/stdc++.h>
#include <vector>
using namespace std;

int main() {
    ios_base::sync_with_stdio(0);
    cin.tie(0);
    cout.tie(0);
    map<char,int> m;
    m['P']=3,m['p']=2,m['G']=1,m['g']=0,m['m']=0;
    string s;
    cin>>s;
    int q;
    cin>>q;
    vector<int> a(s.size()+1);
    for(int i=0;i<s.size();i++){
        int x=m[s[i]];
        a[i+1]=a[i]+x;
    }
    while(q--){
        int l,r;
        cin>>l>>r;
        cout<<a[r]-a[l-1]<<endl;
    }
    return 0;
}
// 64 位输出请用 printf("%lld")
发表于 2025-07-06 15:35:09 回复(0)