COW
问题描述
奶牛贝茜在她最喜欢的牧场中发现了一块石碑,上面刻有神秘的碑文。
碑文的文字似乎来自一种神秘的古代语言,可看作一个只包含 C,O,W 三种字符的字符串。
尽管贝茜无法解密该文字,但是她很欣赏 C,O,W 按顺序构成她最喜欢的单词 COW。
她想知道 COW 在碑文中一共出现了多少次。
她不介意 C,O,W 之间是否存在其他字符,只要这三个字符按正确的顺序出现即可。
她也不介意多个不同的 COW 是否共享了一些字符。
例如,COW 在 CWOW 中只出现一次,在 CCOW 中出现两次,在 CCOOWW 中出现八次。
给定碑文中的文字,请帮助贝茜计算 COW 出现的次数。
输入格式
第一行包含 N
。
第二行包含一个长度为 N
的字符串,其中只包含字符 C,O,W。
输出格式
输出给定字符串中 COW 作为子序列(不一定连续)的出现次数。
数据范围
1≤N≤105
输入样例:
6
COOWWW
输出样例:
6
记忆化搜索
- 输入字符串
- 从前往后遍历
- 如果遍历到‘O’,它只会与前面的‘C’组成”CO“,所以不需要管后面的‘C’的数量
- 同理如果遍历到‘W’,它只会与前面的‘CO’组成”COW“,所以不需要管后面的‘CO’的数量
- 记录当前‘C’,“CO”,“COW”的个数
时间复杂度O(N)
#include <iostream>
#include <cstring>
#include <algorithm>
#include <cstdio>
using namespace std;
int n;
string s;
int main()
{
long long c, o, w;
c = o = w = 0;
cin >> n >> s;
for(auto ch : s)
{
if (ch == 'C') c++;
else if(ch == 'O') o += c;
else w += o;
}
cout << w << endl;
return 0;
}
位运算
#include <bits/stdc++.h>
using namespace std;
typedef long long LL;
LL c = 0, o = 0, w = 0;
int n;
string s;
int main()
{
cin >> n >> s;
for(auto ch : s)
{
c += !(ch ^ 'C');
o += c * !(ch ^ 'O');
w += o * !(ch ^ 'W');
}
cout << w << endl;
return 0;
}