#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;
}
#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;
}

京公网安备 11010502036488号