寒假每日一题——COW

COW

问题描述

奶牛贝茜在她最喜欢的牧场中发现了一块石碑,上面刻有神秘的碑文。

碑文的文字似乎来自一种神秘的古代语言,可看作一个只包含 C,O,W 三种字符的字符串。

尽管贝茜无法解密该文字,但是她很欣赏 C,O,W 按顺序构成她最喜欢的单词 COW

她想知道 COW 在碑文中一共出现了多少次。

她不介意 C,O,W 之间是否存在其他字符,只要这三个字符按正确的顺序出现即可。

她也不介意多个不同的 COW 是否共享了一些字符。

例如,COWCWOW 中只出现一次,在 CCOW 中出现两次,在 CCOOWW 中出现八次。

给定碑文中的文字,请帮助贝茜计算 COW 出现的次数。

输入格式
第一行包含 N

第二行包含一个长度为 N 的字符串,其中只包含字符 C,O,W

输出格式
输出给定字符串中 COW 作为子序列(不一定连续)的出现次数。

数据范围

1≤N≤105

输入样例:

6
COOWWW

输出样例:

6

记忆化搜索

  1. 输入字符串
  2. 从前往后遍历
  3. 如果遍历到‘O’,它只会与前面的‘C’组成”CO“,所以不需要管后面的‘C’的数量
  4. 同理如果遍历到‘W’,它只会与前面的‘CO’组成”COW“,所以不需要管后面的‘CO’的数量
  5. 记录当前‘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;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值