奶牛贝茜在她最喜欢的牧场中发现了一块石碑,上面刻有神秘的碑文。
碑文的文字似乎来自一种神秘的古代语言,可看作一个只包含 三种字符的字符串。
尽管贝茜无法解密该文字,但是她很欣赏 按顺序构成她最喜欢的单词
。
她想知道 在碑文中一共出现了多少次。
她不介意 之间是否存在其他字符,只要这三个字符按正确的顺序出现即可。
她也不介意多个不同的 是否共享了一些字符。
例如, 在
中只出现一次,在
中出现两次,在
中出现八次。
给定碑文中的文字,请帮助贝茜计算 出现的次数。
输入格式
第一行包含 。
第二行包含一个长度为 的字符串,其中只包含字符
。
输出格式
输出给定字符串中 作为子序列(不一定连续)的出现次数。
数据范围
输入样例:
6
COOWWW
输出样例:
6
解法一
using namespace std;
typedef long long LL;
const int N = 100010;
int n;
char str[N];
int cnum[N], wnum[N];
int main(){
scanf("%d%s", &n, str);
for(int i = 0; i < n; i++) cnum[i] = cnum[i - 1] + (str[i] == 'C');
for(int i = n - 1; i >= 0; i--) wnum[i] = wnum[i + 1] + (str[i] == 'W');
LL res = 0;
for(int i = 0; i < n; i++){
if(str[i] == 'O') res += cnum[i] * wnum[i];
}
printf("%lld\n", res);
return 0;
}
解法二
using namespace std;
typedef long long LL;
const int N = 100010;
int n;
char s[N];
int main(){
scanf("%d", &n);
scanf("%s", s);
LL a = 0, b = 0, c = 0;
for (int i = 0; i < n; i++)
if (s[i] == 'C') a ++ ;
else if (s[i] == 'O') b += a;
else c += b;
printf("%lld\n", c);
return 0;
}