牛客 小白月赛3 躲藏

链接: https://www.nowcoder.com/acm/contest/87/B
来源:牛客网

题目描述

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

输入描述:

输入数据有多行,每行有一个字符串。

输出描述:

输出数据应有多行,每行表示一个答案取模后的结果。
示例1

输入

Cwbc

输出

1

说明

Cwbc作为子序列仅出现了1次。
示例2

输入

acdcecfwgwhwibjbkblcmcnco

输出

81

说明

Cwbc作为子序列出现了34=81次。

备注:

每行字符串长度不超过2×105,字符串总长度不超过106
 
 

思路: 从后向前暴力一遍就可以。   memset 会超时。好坑的。

#include<bits/stdc++.h>

using namespace std;
typedef long long ll;

const ll mod= 2000120420010122;

const int N =2e5+5;

ll prec[N];
ll postc[N];
ll postb[N];
ll postw[N];
ll postcc[N];
char s[N];

int main()
{
    while(scanf("%s",s)!=EOF)
    {
        int len=strlen(s);
        for(int i=0;i<len;i++){
            if(s[i]>='A'&&s[i]<='Z'){
                s[i]+=32;
            }
        }
        for(int i=0;i<=len;i++){
            postc[i]=0;
            postb[i]=0;
            postcc[i]=0;
            postw[i]=0;
        }
        /*
        for(int i=0;i<len;i++){
            if(i==0) prec[i]=s[i]=='c'?1:0;
            else prec[i]=prec[i-1]+(s[i]=='c'?1:0);
        }
        */

        for(int i=len-1;i>=0;i--){
            postc[i]=postc[i+1]+(s[i]=='c'?1:0);
            if(s[i]=='b') postb[i]=postc[i];
            postb[i]=(postb[i+1]+postb[i])%mod;
            if(s[i]=='w') postw[i]=postb[i];
            postw[i]=(postw[i+1]+postw[i])%mod;
            if(s[i]=='c') postcc[i]=postw[i];
            postcc[i]=(postcc[i+1]+postcc[i])%mod;
        }

        printf("%lld\n",postcc[0]);

        //printf("%lld\n",ans);

    }
    return 0;
}

猜你喜欢

转载自blog.csdn.net/yjt9299/article/details/80295673