牛客小白月赛3-B.躲藏;

题目描述:

XHRlyb和她的小伙伴Cwbc在玩捉迷藏游戏。 Cwbc藏在多个不区分大小写的字符串中。 好奇的XHRlyb想知道,在每个字符串中Cwbc作为子序列分别出现了多少次。 由于Cwbc可能出现的次数过多,你只需要输出每个答案对2000120420010122取模后的结果。 聪明的你在仔细阅读题目后,一定可以顺利的解决这个问题!

输入有多行,每行一个字符串。输出数据应有多行,每行表示答案取模后的结果。 每行字符串长度不超过2×10 5 ,字符串总长度不超过10 6
示例1

输入
Cwbc
输出

1
示例2

输入
acdcecfwgwhwibjbkblcmcnco
输出

81
解题思路:先去除多余字符,转换成小写
                 c->cw>cwb>cwbc;

                 cw序列的数量:向后遍历,每当遇见w字符,cw序列数=原cw序列数+c字符数;
                 cwb序列的数量:向后遍历,每当遇见b字符,cwb序列数=原cwb序列数+cw序列数;

                 cwbc序列的数量:向后遍历,每当遇见c字符,cwbc序列数=原cwbc序列数+cwb序列数。
#include<bits/stdc++.h>
#define mod 2000120420010122
using namespace std;

char str1[200005],str2[200005];
int main()
{
    //char str1[200005],str2[200005];
    long long b[4];
    while(~scanf("%s",str1))
    {
        memset(b,0,sizeof(b));
        int i,j=0,n=strlen(str1);
        for(i=0;i<n;i++)
        {
            if(str1[i]=='C'||str1[i]=='W'||str1[i]=='B')
                str1[i]=str1[i]+32;
            if(str1[i]=='c'||str1[i]=='w'||str1[i]=='b')
            {
                str2[j++]=str1[i];
            }
        }
        int m=j;
        for(i=0;i<m;i++)
        {
            if(str2[i]=='c')
            {
                b[0]++;//记录'c'的数量
                b[3]=(b[3]+b[2])%mod;//记录"cwbc"数量;
            }
            if(str2[i]=='w')
            {
                b[1]=(b[1]+b[0]);//记录"cw"数量
            }
            if(str2[i]=='b')
            {
                b[2]=(b[2]+b[1]);//记录"cwb"数量
            }
        }
        printf("%lld\n",b[3]);
    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值