躲藏
链接: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×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; }