学习C++从娃娃抓起!记录下在学而思小猴编程学习过程中的题目,记录每一个瞬间。侵权即删,谢谢支持!
附上汇总贴:小猴编程C++ | 汇总-CSDN博客
【题目描述】
小猴有n个水晶球排成一排,每一个水晶球的颜色都是红、橙、黄、绿、蓝等等26种颜色中的一种,这些水晶球从左到右依次编号为1,2,…,n。
小猴最近刚刚学完回文相关知识点:如果一个字符串不论是从左向右看,还是从右向左看,内容都一样,那么这个字符串就是一个回文字符串。例如ABBA,AAA,YRURY和Q都是回文字符串,而ABCA、ABAB和BA则不是。
猴博士想要测试一下小猴是否完全理解了回文这个一知识点,向他提出了q个相关问题。其中第i个问题是:小猴能否使用编号在 l i l_i li到 r i r_i ri之间(包括两个端点)的所有水晶球,经过任意的重排,使得 l i l_i li到 r i r_i ri之间的所有水晶球在颜色上的排列能构成一个回文,即第 l i l_i li个水晶球颜色与第 r i r_i ri个水晶球颜色相同,第 l i + 1 l_i+1 li+1个水晶球颜色与第 r i − 1 r_i-1 ri−1个水晶球颜色相同,第 l i − 2 l_i-2 li−2个水晶球颜色与第 r i − 2 r_i-2 ri−2个水晶球颜色相同, …
请你帮助小猴统计q个问题中一共有多少个问题的结果是能够构成回文。
【输入】
第一行两个整数n,q;
第二行一个长度为n的字符串str,表示排成一排的水晶球颜色,str只包含大写字符A~Z,其中每一个字符对应一种不同的颜色。
接下来q行,每行两个整数 l i , r i l_i,r_i li,ri,表示一个问题。
【输出】
一行一个整数,表示q个问题中一共有多少个问题的结果是能够构成回文。
【输入样例】
9 3
ABBCAAATC
1 3
2 6
37
【输出样例】
2
【代码详解】
#include <bits/stdc++.h>
using namespace std;
int main()
{
int n, q;
cin >> n >> q;
string s;
cin >> s;
s = 'a' + s;
int sum = 0;
int lcnt[500005][26]; // 这里vscode无法运行下去
for (int i=1; i<=n; i++)
//前i个字符中,ABCD...的个数为cnt[i][j] 个
for (int j=0; j<26; j++)
lcnt[i][j] = lcnt[i-1][j] + (s[i]-'A'==j);
while (q--) {
int l, r;
cin >> l >> r;
int tong = 0;
for (int i=0; i<=25; i++)
if ((lcnt[r][i]-lcnt[l-1][i])%2==1)
tong++;
if (tong<=1)
sum++;
}
cout << sum;
return 0;
}
【运行结果】
9 3
ABBCAAATC
1 3
2 6
3 7
2