奶牛碑文
题目描述
小伟暑假期间到大草原旅游,在一块石头上发现了一些有趣的碑文。碑文似乎是一个神秘古老的语言,只包括3个大写字母C、O、W。尽管小伟看不懂,但是令他高兴的是,C、O、W的顺序形式构成了一句他最喜欢的奶牛单词COW。现在,他想知道有多少次COW出现在文本中。 如果COW内穿插了其他字符,只要COW字符出现在正确的顺序,小伟也不介意。甚至,他也不介意出现不同的COW共享一些字母。例如,CWOW出现了1次COW,CCOW算出现了2次COW,CCOOWW算出现了8次COW
输入描述
第一行一个整数N
第二行为N个字符的一个字符串,每个字符是一个C、O、W
输出描述
输出COW作为输入字符串的字串出现的次数(不一定是连续的)
提示:答案会很大,建议用64位整数(long long)
样例
输入
6
COOWWW
输出
6
思路
使用cc和ww数组记录下每一位数字前的C的数量和后面W的数量,再通过查找O的位置,每一个O都可以任选前面的C和后面的W组成一个COW,所以将每一个O的C和W组合统计起来即可。结果可能很大,开long long存下。
coding:
#include <iostream>
#include <string>
using namespace std;
long long res = 0;
int c = 0, w = 0, cow[100005], cc[100005], ww[100005];
int main()
{
int n;
cin >> n;
string str;
cin >> str;
for (int i = 0; i < n; i++)
{
if (str[i] == 'C')
{
c++;
}
cc[i] = c;
}
for (int i = n - 1; i >= 0; i--)
{
if (str[i] == 'W')
{
w++;
}
ww[i] = w;
}
for (int i = 0; i < n; i++)
{
if (str[i] == 'O')
{
res += cc[i] * ww[i];
}
}
cout << res;
return 0;
}