青藤oj #210733. 奶牛碑文

这篇博客介绍了青藤oj的一道编程题#210733,即奶牛碑文问题。博主探讨了如何解决寻找字符串中"COW"子序列出现次数的问题,提供了输入输出格式,解题思路以及代码实现,特别指出答案可能非常大,推荐使用64位整数类型来存储。

青藤oj #210733. 奶牛碑文

http://www.wikioi.cn/problem/210733

题目描述

小伟暑假期间到大草原旅游,在一块石头上发现了一些有趣的碑文。碑文似乎是一个神秘古老的语言,只包括三个大写字母 C 、O 和 W。尽管小伟看不懂,但是令他高兴的是,C 、O 、W 的顺序形式构成了一句他最喜欢的奶牛单词 “COW” 。现在,他想知道有多少次 COW 出现在文本中。如果 COW 内穿插了其他字符,只要 COW 字符出现在正确的顺序,小伟也不介意。甚至,他也不介意出现不同的 COW 共享一些字母。例如,CWOW 出现了1次 COW ,CCOW 算出现了2次 COW ,CCOOWW 算出现了8次 COW 。

输入格式

输入包括一行仅仅包括 “C”,“O”,“W” 的字符串

输出格式

输出 COW 作为输入字符串的子序列出现的次数(不一定是连续的)。提示:答案会很大,建议用 64 位整数(long long)。

思路

先储存‘C’的个数和‘W’个数,再找‘O’,然后把‘C’与‘W’个数相乘累加

代码

#include <bits/stdc++.h>
using namespace std;
char a[100005];
int b[100005] = { 0 }, c[100005] = { 0 };
int main() {
    int n;
    long long sum = 0, sumc = 0, sumw = 0;
    cin >> a;
    n = sizeof(a);
    for (int i = 0; i < n; i++) {
        if (a[i] == 'C') {
            sumc++;
        }
        b[i] = sumc;
    }
    for (int i = n - 1; i >= 0; i--) {
        if (a[i] == 'W') {
            sumw++;
        }
        c[i] = sumw;
    }
    for (int i = 0; i < n; i++) {
        if (a[i] == 'O')
            sum += b[i] * c[i];
    }
    cout << sum;
    return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值