#include <string>
#include <iostream>
using namespace std;

// https://ac.nowcoder.com/acm/contest/127264/D
/*
    颜色块的数量为 满足s[i] != s[i-1] 的i的数量
    若反转使得左边界产生了贡献,则右边界需消掉一个贡献,反之亦然
    如    0[010 1]011    ->    0[101 0]011
    颜色块    6          ->        6
    左侧变化后产生了贡献,0[0没有贡献,变为0[1后有了一个贡献,
    右侧变化后消除了贡献,1]0右一个贡献,变为0]0后消除了一个贡献
    特殊的,当左边界包括第一个数时,无论右边界处是否有贡献,都会使得贡献发生变化
    所以,当左边界包括第一个数时,右边界必须包括最后一个数,即整体翻转
    
    依次遍历该01字符串,int i=0; i<n-1; i++
    对于每一个 s[i]==s[i+1] 或 s[i]!=s[i+1]
    使该处作为有边界,使得 ans += diff 或 same
    随后使得 same++; 或diff++; 
    其中 diff same 分别为截止至此处,左侧使得s[i]!=s[i+1] 或 s[i]==s[i+1]成立的i的个数
*/

void solve(){
    string s;
    cin >> s;
    int n = s.size();
    if(n==1){
        cout << 1;
        return;
    }
    
    int diff = 0;
    int same = 0;
    unsigned long long ans = 1;    // 此处的1为翻转整个字符串
    for(int i=0;i<n-1;i++){
        if(s[i]==s[i+1]){
            ans += diff;
            same++;
        }else{
            ans += same;
            diff++;
        }
    }
    cout << ans;
}

int main(){
    std::ios::sync_with_stdio(false);
    solve();
    return 0;
}