记录每个位置所对应的字符的之前和之后出现的位置,两者相乘则是该位置的字符的贡献,依次相加即可
#include<bits/stdc++.h>
using namespace std;
const int N = 1e5+5;
typedef long long ll;
ll R[N] , L[N] , vis[30];
char str[N];
int main(){
scanf("%s",str+1);
int t=strlen(str+1)+1;
memset (vis , 0,sizeof (vis));
for (int i = 1;i < t;i++){
int k = str[i]-'a';
L[i] = vis[k]; //该字符上次出现的位置 默认为0
vis[k] = i;
}
for(int i = 0;i < 30;i++){
vis[i] = t; //← ← ← ← ← ← ← ← ←
} // ↑
for (int i = t - 1;i >= 1;i--){ // ↑
int k = str[i]-'a'; // ↑
R[i] = vis[k]; //该字符上次出现的位置 默认为最右
vis[k] = i;
}
ll cnt = 0;
for (int i = 1;i < t;i++){
cnt+=(ll)(i - L[i])*(R[i] - i); //防止爆int
}
cout<< cnt <<endl;
return 0;
}