题目链接:https://cn.vjudge.net/problem/CodeForces-1084C
题目大意:
给你一个由小写字母组成的字符串 s ,让你找一种序列:
1、对于任意一个 i ,使得 s[ p[ i ] ] == 'a'
2、对于任意一个 i ,存在 p[ i ] < j < p[i + 1],且s[ p[ i ] ] == 'b'
求这种序列有多少个,答案 mod 1e9
解题思路:
首先预处理字符串 S ,使得串中不存在除 a 、b 意外的字母且任意两个 b 不相邻,然后定义一个 last 变量存上一个 b 位置之前有多少序列,然后递推 dp:dp[ i ] = dp[ i - 1] + last + 1
AC代码:
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
char a[100005], s[100005];
ll dp[100005] = {0}, p = 0;
int main()
{
ll i;
scanf("%s", s + 1);
int len = strlen(s + 1);
a[p] = '*';
for(i = 1; i <= len; i++)
{
if(s[i] == 'a')a[++p] = s[i];
else if(s[i] == 'b' && a[p] != 'b')a[++p] = s[i];
}
ll last = 0;
for(i = 1; i <= p; i++)
{
if(a[i] == 'a')dp[i] = dp[i - 1] + last + 1;
else last = dp[i - 1], dp[i] = dp[i - 1];
dp[i] %= 1000000007;
}
printf("%lld\n", dp[p]);
return 0;
}