Codeforces Round #526 (Div. 2) C. The Fair Nut and String
阿新 • • 發佈:2018-12-13
C. The Fair Nut and String
題目連結:https://codeforces.com/contest/1084/problem/C
題意:
給出一個字串,找出都為a的子序列(比如ai,aj,ak)滿足以下條件的個數:
1.子序列的索引單增(i<j<k);
2.在原字串中,若ai=aj=ak=a,那麼滿足i<=k1<j,j<=k2<k 並且 ak1=ak2=b。
通俗點說,就是找這樣的子序列個數:要麼單個a,要麼每個a之間都有一個b。
題解:
我們考慮在字串末尾增加一個”哨兵“,其值為b。然後用b對a進行分割,每一段a 的個數為ai。
最後統計結果:(a1+1)*(a2+1)*...*(ax+1)-1。這裡減去1是因為至少沒有什麼都不選的情況。
程式碼如下:
#include <bits/stdc++.h> using namespace std; typedef long long ll; const int N = 1e5+5,MOD = 1e9+7; char s[N]; ll a[N]; int main(){ scanf("%s",s); int len=strlen(s); s[len]='b'; int num=0,cnt=0; for(int i=0;i<=len;i++){ if(s[i]=='a') num++; if(s[i]=='b'){ a[++cnt]=num; num=0; } } ll ans = 1; for(int i=1;i<=cnt;i++) ans=ans*(a[i]+1)%MOD; printf("%I64d",ans-1); return 0; }