P12271 [蓝桥杯 2024 国 Python B] 括号与字母
题目描述
给定一个仅包含小写字母和括号的字符串 SSS,保证括号可以两两匹配。
给出 QQQ 组询问,每组询问给出一个小写字母 cic_ici 和一个数 xix_ixi,询问 SSS 中有多少对匹配的括号之间有不少于 xix_ixi 个 cic_ici。
输入格式
输入的第一行包含一个字符串 SSS。
第二行包含一个整数 QQQ。
接下来 QQQ 行,每行包含一个小写字母 cic_ici 和一个整数 xix_ixi 表示一组询问,用一个空格分隔。
输出格式
输出 QQQ 行,每行包含一个整数,依次表示每个询问的答案。
输入输出样例 #1
输入 #1
((a)()((b)((c))))
3
a 2
b 1
c 1
输出 #1
0
3
4
说明/提示
评测用例规模与约定
- 对于 40%40\\%40% 的评测用例,∣S∣,Q≤5000|S|, Q \\leq 5000∣S∣,Q≤5000;
- 对于 70%70\\%70% 的评测用例,∣S∣≤100000|S| \\leq 100000∣S∣≤100000;
- 对于所有评测用例,1≤∣S∣≤1061 \\leq |S| \\leq 10^61≤∣S∣≤106,1≤Q≤1000001 \\leq Q \\leq 1000001≤Q≤100000,0≤xi<1060 \\leq x_i < 10^60≤xi<106。其中 ∣S∣|S|∣S∣ 表示 SSS 的长度。
C++实现
#include<bits/stdc++.h>
using namespace std;
const int N=1e6+5;
const int M=26;
int n,Q,S[M][N],F[M][N];
string C;
int main()
{
ios::sync_with_stdio(0);
cin.tie(0),cout.tie(0);
cin>>C>>Q;
n=C.size(),C=" "+C;
stack<int>St;
for(int i=1;i<=n;i++)
{
for(int j=0;j<M;j++)
S[j][i]=S[j][i–1]+(C[i]==j+'a');
if(C[i]=='(')
St.push(i);
if(C[i]==')')
{
int L=St.top();St.pop();
for(int j=0;j<M;j++)
F[j][S[j][i]–S[j][L–1]]++;
}
}
for(int j=0;j<M;j++)
for(int i=n;i>=0;i—)
F[j][i]+=F[j][i+1];
while(Q—)
{
char c;int x;
cin>>c>>x;
cout<<F[c–'a'][x]<<endl;
}
}

后续
接下来我会不断用C++来实现信奥比赛中的算法题、GESP考级编程题实现、白名单赛事考题实现,记录日常的编程生活、比赛心得,感兴趣的请关注,我后续将继续分享相关内容




![P11246 [GESP202409 六级] 小杨和整数拆分-171主机测评](https://www.171host.com/wp-content/uploads/2026/11/20261108100631-6af049a75855c-220x150.png)

