躲藏

链接:https://www.nowcoder.com/acm/contest/87/B

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

输入描述:

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

输出描述:

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

输入

Cwbc

输出

1

说明

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

输入

acdcecfwgwhwibjbkblcmcnco

输出

81

说明

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

备注:

每行字符串长度不超过2×10

5

,字符串总长度不超过10

6





开两个数组,一个反向遍历,a[i]储存符合的bc,一个正向遍历b[i]储存符合的c 查找w结果就是pos+=(a[i]*b[i]);
#include <iostream>
#include <algorithm>
#include <cstring>
#include <cstdio>
#include <vector>
#include <queue>
#include <stack>
#include <cstdlib>
#include <iomanip>
#include <cmath>
#include <cassert>
#include <ctime>
#include <map>
#include <set>
using namespace std;
#pragma comment(linker, "/stck:1024000000,1024000000")
#define lowbit(x) (x&(-x))
#define max(x,y) (x>=y?x:y)
#define min(x,y) (x<=y?x:y)
#define MAX 100000000000000000
#define MOD 1000000007
#define pi acos(-1.0)
#define ei exp(1)
#define PI 3.1415926535897932384626433832
#define ios() ios::sync_with_stdio(true)
#define INF 0x3f3f3f3f
#define mem(a) ((a,0,sizeof(a)))
typedef long long ll;
const ll mod=2000120420010122;
char s[200006];
ll a[200006],b[200006];
int main()
{
    while(~scanf("%s",s))
    {
        int k=strlen(s);
        ll  ans=0,pos=0;
        a[k]=0;
        for(int i=k-1;i>=0;i--)
        {
            if(s[i]=='c' || s[i]=='C') ans++;
            a[i]=a[i+1];
            if(s[i]=='b' || s[i]=='B')
            {
                a[i]+=ans;
                a[i]%mod;
            }
        }
        b[0]=(s[0]=='c' || s[0]=='C')?1:0;
        for(int i=1;i<k;i++)
        {
            b[i]=b[i-1];
            if(s[i]=='c' || s[i]=='C') b[i]++;
            if(s[i]=='w' || s[i]=='W')
            {
                pos+=(1ll)*(b[i]*a[i])%mod;
                pos%=mod;
            }
        }
        printf("%lld\n",(1ll)*pos);
    }
    return 0;
}

猜你喜欢

转载自www.cnblogs.com/shinianhuanniyijuhaojiubujian/p/9030090.html