Title:
solution:
容易发现:
当存在s[i]==s[i+1]且s[i]!=s[i+2]时,可以将i之后的所有字符全部变成s[i].
显然从后往前,遇到s[i]==s[i+1]且s[i]!=s[i+2]就操作一次.
设下标为[0,n-1],
那么在i位置进行操作对答案的贡献为(n-1)-i+1-mark[s[i]],其中mark[s[i]]是[i,n-1]中s[i]的数量.
注意操作完之后要修改mark数组.
code:
#include <bits/stdc++.h>
#define int long long
using namespace std;
signed main(){
ios::sync_with_stdio(0);
string s;cin>>s;
int n=s.size();
int ans=0;
map<char,int>mark;
for(int i=n-1;i>=0;i--){
mark[s[i]]++;
if(i>n-3)continue;
if(s[i]==s[i+1]&&s[i]!=s[i+2]){
ans+=(n-1)-i+1-mark[s[i]];
mark.clear();
mark[s[i]]=(n-1)-i+1;
}
}
cout<<ans<<endl;
return 0;
}