1. 程式人生 > >Codeforces Round #526 (Div. 2) C. The Fair Nut and String

Codeforces Round #526 (Div. 2) C. The Fair Nut and String

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; }