#include<vector>
#include<cmath>
#include<map>
#include<cstdlib>
#include<iostream>
#include<sstream>
#include<fstream>
#include<string>
#include<algorithm>
#include<cstring>
#include<cstdio>
#include<set>
#include<stack>
#include<bitset>
#include<functional>
#include<ctime>
#include<queue>
#include<deque>
#include<complex>
#include<cassert>
using namespace std;
#define pb push_back
#define pf push_front
typedef long long lint;
typedef complex<double> P;
#define mp make_pair
#define fi first
#define se second
typedef pair<int,int> pint;
#define All(s) s.begin(),s.end()
#define rAll(s) s.rbegin(),s.rend()
#define REP(i,a,b) for(int i=a;i<b;i++)
#define rep(i,n) REP(i,0,n)
//問題文および制約はちゃんと確認しよう！
//サイズは10^5じゃなくて2×10^5とかかもしれないし、重要な制約・条件を見落としているかも
//とりあえずサンプルを読んでから解法を考えよう？
int sum[100100],ne[100100][3];
lint dp[100100];
int main()
{
	string s;cin>>s;
	int n=s.size(),f=0;
	rep(i,n-1){
		if(s[i]==s[i+1]) f=1;
	}
	if(f<1){
		cout<<1<<endl;return 0;
	}
	sum[0]=0;
	rep(i,n){
		sum[i+1]=sum[i];
		if(s[i]=='a') sum[i+1]++;
		else sum[i+1]+=2;
		sum[i+1]%=3;
	}
	rep(i,3){
		ne[n][i]=n+1;
		for(int j=n;j>0;j--){
			if(sum[j]==i) ne[j][i]=j;
			ne[j-1][i]=ne[j][i];
		}
	}
	memset(dp,0,sizeof(dp));dp[0]=1;
	lint out=0,mo=1000000007;
	rep(i,n){
		rep(j,2){
			int nex=ne[i+1][(sum[i]+j+1)%3];
			dp[nex]+=dp[i];dp[nex]%=mo;
		}
		if(i>0 && sum[i]==sum[n]){
			out+=dp[i];out%=mo;
		}
	}
	out+=dp[n];
	cout<<out%mo<<endl;
}
