题目描述:
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]);
}
}