Codeforces 1084C The Fair Nut and Stringi

https://codeforces.com/problemset/problem/1084/C

C. The Fair Nut and String

time limit per test

1 second

memory limit per test

256 megabytes

input

standard input

output

standard output

The Fair Nut found a string ss. The string consists of lowercase Latin letters. The Nut is a curious guy, so he wants to find the number of strictly increasing sequences p1,p2,…,pkp1,p2,…,pk, such that:

  1. For each ii (1≤i≤k1≤i≤k), spi=spi= 'a'.
  2. For each ii (1≤i<k1≤i<k), there is such jj that pi<j<pi+1pi<j<pi+1 and sj=sj= 'b'.

The Nut is upset because he doesn't know how to find the number. Help him.

This number should be calculated modulo 109+7109+7.

Input

The first line contains the string ss (1≤|s|≤1051≤|s|≤105) consisting of lowercase Latin letters.

Output

In a single line print the answer to the problem — the number of such sequences p1,p2,…,pkp1,p2,…,pk modulo 109+7109+7.

Examples

input

Copy

abbaa

output

Copy

5

input

Copy

baaaa

output

Copy

4

input

Copy

agaa

output

Copy

3

Note

In the first example, there are 55 possible sequences. [1][1], [4][4], [5][5], [1,4][1,4], [1,5][1,5].

In the second example, there are 44 possible sequences. [2][2], [3][3], [4][4], [5][5].

In the third example, there are 33 possible sequences. [1][1], [3][3], [4][4].


题意:两个‘a’之间有‘b’ 或 单独一个‘a’ 有多少种情况

题解:先在最后加上一个‘b’,把连续有多少个a计数成一个数组a,最后for i:a, ans = ans * (a[i]+1) % mod

#include <bits/stdc++.h>
#define INF 0x3f3f3f3f
#define mem(a, x) memset(a, x, sizeof(a))
#define X first
#define Y second
#define rep(i,a,n) for (int i=a;i<n;i++)
#define per(i,a,n) for (int i=n-1;i>=a;i--)
#define pb push_back
#define mp make_pair
#define all(x) (x).begin(),(x).end()
#define SZ(x) ((int)(x).size())
using namespace std;
typedef vector<int> vi;
typedef long long ll;
typedef pair<int,int> pii;
const double PI = acos(-1.0);
const ll mod=1000000007;
ll powmod(ll a,ll b) {ll res=1;a%=mod; assert(b>=0); for(;b;b>>=1){if(b&1)res=res*a%mod;a=a*a%mod;}return res;}
ll gcd(ll a,ll b) { return b?gcd(b,a%b):a;}
//------------------------------------head------------------------------------
const int N = 1e5+10;
string s; 
int a[N];
int main() {
	int n = SZ(s);
	cin >> s;
	s += 'b';
	int cnt = 0, tmp = 0;
	for (char c: s) {
		if (c == 'a') tmp++;
		else if (c == 'b') {
			a[cnt++] = tmp;			
			tmp = 0;
		}
	}
	ll ans = 1;
	rep (i, 0, cnt) {
		ans = ans * (a[i]+1) % mod;
	}
	cout << ans - 1 << endl;
}

 

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值