B 躲藏
链接:https://www.nowcoder.com/acm/contest/87/B
来源:牛客网题目描述
XHRlyb和她的小伙伴Cwbc在玩捉迷藏游戏。
Cwbc藏在多个不区分大小写的字符串中。
好奇的XHRlyb想知道,在每个字符串中Cwbc作为子序列分别出现了多少次。
由于Cwbc可能出现的次数过多,你只需要输出每个答案对 2000120420010122取模后的结果。
聪明的你在仔细阅读题目后,一定可以顺利的解决这个问题!
Cwbc藏在多个不区分大小写的字符串中。
好奇的XHRlyb想知道,在每个字符串中Cwbc作为子序列分别出现了多少次。
由于Cwbc可能出现的次数过多,你只需要输出每个答案对 2000120420010122取模后的结果。
聪明的你在仔细阅读题目后,一定可以顺利的解决这个问题!
输入描述:
输入数据有多行,每行有一个字符串。
输出描述:
输出数据应有多行,每行表示一个答案取模后的结果。
正推
#include <bits/stdc++.h>
using namespace std;
const int maxn=200005;
char q[maxn];
long long int ans=0;
long long int a,b,c,d;
long long int h=2000120420010122;
int main()
{
while(~scanf("%s", q ))
{
int l=strlen(q);
long long int a=0,b=0,c=0,d=0;
for(int i=0;i<l;i++)
{
if(q[i]=='c'||q[i]=='C')
{
a=a+1;
d=d+c;
a=a%h;
d=d%h;
}
if(q[i]=='w'||q[i]=='W')
{
b=b+a;
b=b%h;
}
if(q[i]=='b'||q[i]=='B')
{
c=c+b;
c=c%h;
}
}
cout<<d<<endl;
}
return 0;
}
反推
#include <bits/stdc++.h>
using namespace std;
const int maxn=200005;
char q[maxn];
long long int ans=0;
long long int a,b,c,d;
long long int h=2000120420010122;
int main()
{
while(~scanf("%s", q ))
{
int l=strlen(q);
long long int a=0,b=0,c=0,d=0;
for(int i=l-1;i>=0;i--)
{
if(q[i]=='c'||q[i]=='C')
{
a=a+1;
a=a%h;
d=c+d;
d=d%h;
}
if(q[i]=='w'||q[i]=='W')
{
c=b+c;
c=c%h;
}
if(q[i]=='b'||q[i]=='B')
{
b=a+b;
b=b%h;
}
}
cout<<d<<endl;
}
return 0;
}