思路:
本题有点难想,采用贡献和的思想。首先需要定义一个last数组,用于记录当前遍历的字母s[i]上一次出现在字符串s中的位置。接着遍历数组,计算每一个字母的贡献值。
参考代码:
#include<bits/stdc++.h>
#define INF 0x3f3f3f3f
using namespace std;
typedef long long ll;
int main()
{
ios::sync_with_stdio(false);
string s;
cin >> s;
ll tmp[26], last[100005]; //last数组记录该字母上次出现的位置
fill(tmp, tmp+26, -1);
int len = s.size();
for(int i = 0; i < len; i++)
{
last[i] = tmp[s[i]-'a'];
tmp[s[i]-'a'] = i;
}
ll cnt = 0;
for(int i = 0; i < len; i++)
{
cnt += (i-last[i]) * (len-i);
}
cout << cnt;
return 0;
}