#pragma GCC optimize (2)
#pragma G++ optimize (2)
#include<bits/stdc++.h>
#define INF 0x3f3f3f3f
#define mod 1000000007
#define MAX 100005
using namespace std;
//char nc()
//{
//	static char buf[100000],*p1=buf,*p2=buf;
//	return p1==p2&&(p2=(p1=buf)+fread(buf,1,100000,stdin),p1==p2)?EOF:*p1++;
//}
char nc(){return getchar();}
int read()
{
	int x=0,y=1;
	char c=nc();
	while(!isdigit(c))
	{
		if(c=='-')y=-1;
		c=nc();
	}
	while(isdigit(c))
	{
		x=(x<<1)+(x<<3)+(c^48);
		c=nc();
	}
	return x*y;
}
int n,lst[3],sm[MAX];
char s[MAX];
long long f[MAX];
int main()
{
	scanf("%s",s+1);
	n=strlen(s+1);
	bool flag=false;
	for(int i=1;i<=n;i++)
	{
		if(i>1&&s[i]==s[i-1]) flag=true;
		sm[i]=(sm[i-1]+(s[i]-96))%3;
	}
	if(!flag) return puts("1"),0;  //abababa....
	for(int i=1;i<=n;i++)  //我们如果倒序考虑s,那么除了第一个串以外(即除最短划分外,额外包含一个sm%3==0的前缀),其余一定是最短划分 
	{
		f[i]=(f[lst[(sm[i]+1)%3]]+f[lst[(sm[i]+2)%3]]+(sm[i]?1:0))%mod; //新增a,新增b,成为一个新的串
		lst[sm[i]]=i;  //对于lst,abababa...出现一定早于余数相同的a/b,因此合法 
	}
	printf("%lld",f[n]);
	return 0;
}
