题解-带说明
2025-05-01 15:00:27
发布于:四川
4阅读
0回复
0点赞
/*
本题要求统计字符串s当中共有多少个为 zzy 的子序列,且特别提示:注意是子序列而
非子串。通过看样例,知道子序列指出现zzy顺序的组合,且字符之间可以是不相邻的。
最简单的模拟方法就是使用三层循环,第一、二层代表 z,第三层循环代表y。由于字符
串s的长度最大可达1e6,肯定会超时,解本题要得100分,只能使用一层循环,这通常需要
使用数学公式。在只能有一层循环的前提下,可以不断统计出现z的数量(设定为n),每
出现一次y,就计算一次可以有多少种zzy顺序的组合。根据排列组合的原理,从n个z中选
2个z的方法有 n*(n-1)/2 种。有了这个公式,解本题就非常简单了。
*/
#include<bits/stdc++.h>
using namespace std;
string s;
long long cnt, n;
int main() {
cin >> s;
for(int i = 0; i < s.size(); i++) {
if(s[i] == 'z') n++;
if(s[i] == 'y') {
long long m = n * (n-1) / 2;
cnt += m;
}
}
cout << cnt;
return 0;
}
这里空空如也
有帮助,赞一个