开心和哭哭
题目描述
小 P 经常忘记回复 Rain 的信息,为了方便,他决定写一个自动回复程序。
Rain 每天会发送若干个表情,每个表情为“哭哭”或者“开心”,其中“哭哭”用 0 0 0 表示,“开心”用 1 1 1 表示。也就是说,她每天发送的表情可以被表示为一个 01 01 01 串。
你需要以如下方式计算 Rain 每天的心情值并输出它们:
- 心情值为每天有效的开心表情数量减有效的哭哭表情数量;
- 如果 Rain 连续发了大于等于三个相同表情,那么这些表情被计算为一个有效表情。对于其他情况,所有发送的表情均为有效表情。
例:对于发送的表情 011100
,Rain 的心情值为
−
2
-2
−2。可以注意到她连续发送了三个开心表情,它们只需被计算一次。
输入格式
第一行输入一个数字 t t t,代表需要计算的天数。
之后的 t t t 行中,每行一个数 s i s_i si 与一个 01 01 01 串,其中 s i s_i si 代表 01 01 01 串的长度。 01 01 01 串意义同题意。
输出格式
输出 t t t 行,每行一个整数代表 Rain 的心情值。
样例 #1
样例输入 #1
3
6 011100
7 1111000
4 1011
样例输出 #1
-2
0
2
提示
分值 | t t t | ∑ s i \sum s_i ∑si | 特殊性质 |
---|---|---|---|
10 | ≤ 100 \le 100 ≤100 | ≤ 1 0 5 \le 10^5 ≤105 | A |
20 | ≤ 100 \le 100 ≤100 | ≤ 1 0 5 \le 10^5 ≤105 | B |
30 | ≤ 1 \le 1 ≤1 | ≤ 1000 \le 1000 ≤1000 | 无 |
40 | ≤ 100 \le 100 ≤100 | ≤ 1 0 5 \le 10^5 ≤105 | 无 |
特殊性质 A:给出的
01
01
01 串均满足
01
01
01 交替出现;
特殊性质 B:给出的
01
01
01 串均满足
000
000
000 与
111
111
111 交替出现;
对于所有数据满足: 1 ≤ t ≤ 100 1\le t\le 100 1≤t≤100, 1 ≤ ∑ s i ≤ 1 0 5 1\le \sum s_i\le 10^5 1≤∑si≤105。
注: ∑ s i \sum s_i ∑si 代表所有 s i s_i si 之和。
AC代码:
#include <iostream>
#include <string>
using namespace std;
int calculateMood(const string &str) {
int mood = 0;
int count = 1; // 第一个字符
for (int i = 1; i < str.length(); i++) {
if (str[i] == str[i - 1]) {
count++;
} else {
if (count >= 3) {
mood += (str[i - 1] == '0') ? -1 : 1;
} else {
mood += (str[i - 1] == '0') ? -count : count;
}
count = 1; // 为新字符重置计数
}
}
// 处理连续字符的最后一个组
if (count >= 3) {
mood += (str.back() == '0') ? -1 : 1;
} else {
mood += (str.back() == '0') ? -count : count;
}
return mood;
}
int main() {
int t;
cin >> t;
while (t--) {
int n;
string str;
cin >> n >> str;
int mood = calculateMood(str);
cout << mood << endl;
}
return 0;
}