Codeforces 1084C The Fair Nut and String(乘法原理和加法原理)
题目大意
问给定的字符串有多少形如"a","aba","ababa"...的子串.
解题思路
这题需要考虑将字符'b'做分隔符,把每个含'a'不含'b'的区间分隔开,那么就很好解决了.
对于第一个区间的'a',它只能选自己,所以它的选法就是这个区间'a'的数量;对于第二个区间,它有两种选择,一种是与上一个区间的子串结合,还有一种是不与前面的结合,只选自己,那么选法就是这个区间的'a'的数量乘以上一个区间所有符合条件的子串数量再加上这个区间的'a'的数量;对于第三个区间,也是两种选法...
所以说从左到右每个区间可以形成的子串数量可以根据前面的结果递推出来,最终的结果就是所有区间可以形成的子串数量之和.
代码
const int maxn = 2e5+10;
char str[maxn] = "%";
int main(){
cin >> str+1;
int len = strlen(str);
str[len] = 'b';
ll ans = 0;
for (int i = 1, cnt = 0; i<=len; ++i) {
if (str[i]=='a') ++cnt;
else if (str[i]=='b'&&cnt) {
ans = (ans+ans*cnt+cnt)%MOD;
cnt = 0;
}
}
cout << ans << endl;
return 0;
}