分析每个字母的共献度
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N = 1e6 + 10;
char s[N];
ll vis[40];
int main() { //abc 10
scanf("%s", s + 1);
int n = strlen(s + 1);
ll ans = 0;
for (int i = 1; i <= n; i++) {
ans += (i - vis[s[i] - 'a']) * (n - i + 1);
vis[s[i] - 'a'] = i; //记录上次的出现位置
}
cout << ans << endl;
return 0;
}
//aba
//a ab aba b ba a 9 第二个 a 在aba没贡献
//abc
//a ab abc b bc c 10
//abab (n-i+1) 4 3 2 1
//a ab aba abab b ba bab a ab b
//第一个a贡献4次, 第二个b贡献6次, 第三个a贡献4次,
//第四个b贡献2次
//一共 16次
//第三个a为例,n-3+1为2,代表a,ab有两个操作空间
//3-1=2,代表b,a 两个空间,ba,bab,a,ab