牛客網小白月賽3 B 躲藏 簡單DP
阿新 • • 發佈:2019-02-06
B 躲藏
來源:牛客網題目描述
XHRlyb和她的小夥伴Cwbc在玩捉迷藏遊戲。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; }