链接:
https://www.nowcoder.com/acm/contest/87/B
来源:牛客网
来源:牛客网
题目描述
XHRlyb和她的小伙伴Cwbc在玩捉迷藏游戏。
Cwbc藏在多个不区分大小写的字符串中。
好奇的XHRlyb想知道,在每个字符串中Cwbc作为子序列分别出现了多少次。
由于Cwbc可能出现的次数过多,你只需要输出每个答案对 2000120420010122取模后的结果。
聪明的你在仔细阅读题目后,一定可以顺利的解决这个问题!
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;
}