#pragma GCC optimize("O3") #include #define ll long long #define rep(i,n) for(ll i=0;i<(n);i++) #define pll pair #define pii pair #define pq priority_queue #define pb push_back #define eb emplace_back #define fi first #define se second #define endl '\n' #define ios ios_base::sync_with_stdio(0),cin.tie(0),cout.tie(0); #define lb(c,x) distance(c.begin(),lower_bound(all(c),x)) #define ub(c,x) distance(c.begin(),upper_bound(all(c),x)) using namespace std; inline int topbit(unsigned long long x){ return x?63-__builtin_clzll(x):-1; } inline int popcount(unsigned long long x){ return __builtin_popcountll(x); } inline int parity(unsigned long long x){//popcount%2 return __builtin_parity(x); } template inline bool chmax(T& a,T b){if(a inline bool chmin(T& a,T b){if(a>b){a=b;return 1;}return 0;} const ll INF=1e9+7; int main(){ string s; cin >> s; ll n=s.length(); pll now; now.fi=0,now.se=0; bool up=true; map q; vector p(3),buf(3); p[0]=0,p[1]=1,p[2]=2; q[0]=0,q[1]=1,q[2]=2; set ans; ans.insert({0,0}); rep(i,n){ ll num=s[i]-'a'; ll v=q[num]; if(up){ if(v==0){ buf[0]=p[1]; q[buf[0]]=0; buf[1]=p[0]; q[buf[1]]=1; buf[2]=p[2]; q[buf[2]]=2; p=buf; now.fi-=1; now.se+=1; ans.insert(now); } if(v==1){ buf[0]=p[0]; q[buf[0]]=0; buf[1]=p[2]; q[buf[1]]=1; buf[2]=p[1]; q[buf[2]]=2; p=buf; now.fi+=1; now.se+=1; ans.insert(now); } if(v==2){ buf[0]=p[2]; q[buf[0]]=0; buf[1]=p[1]; q[buf[1]]=1; buf[2]=p[0]; q[buf[2]]=2; p=buf; now.se-=2; ans.insert(now); } up=false; } else{ if(v==0){ buf[0]=p[2]; q[buf[0]]=0; buf[1]=p[1]; q[buf[1]]=1; buf[2]=p[0]; q[buf[2]]=2; p=buf; now.se+=2; ans.insert(now); } if(v==1){ buf[0]=p[1]; q[buf[0]]=0; buf[1]=p[0]; q[buf[1]]=1; buf[2]=p[2]; q[buf[2]]=2; p=buf; now.fi+=1; now.se-=1; ans.insert(now); } if(v==2){ buf[0]=p[0]; q[buf[0]]=0; buf[1]=p[2]; q[buf[1]]=1; buf[2]=p[1]; q[buf[2]]=2; p=buf; now.fi-=1; now.se-=1; ans.insert(now); } up=true; } } cout << ans.size() << endl; return 0; }