题解:
首先明白,遍历从左到右遍历。
如果单纯不考虑重复的情况下,一个字符串第i个字符的贡献度有i*(len-i+1)。--也就是她可以组成i*(len-i+1)个子串。
如果考虑了重复的情况,
例如
ababc
当i=3时候,也就是第三个字符---‘a’,那么,这个时候如果计算a3的贡献度,就不能考虑有a1的子串,也就是在使用乘法公式的时候,把a1以前的情况剪掉,由原来的3*3 变成
(3-1)*3,因为我们计算的是a3的贡献度,如果a1出现,a3就没有贡献度了。
代码如下:
#include<iostream>
#include<set>
#include<string>
#define ll long long
using namespace std;
int main()
{
ll n;
string s;
cin>>s;
int a[30]={0};
s="0"+s;
ll sum=0;
n=s.length()-1;
for(int i=1;i<=n;i++)
{
sum+=(i-a[s[i]-'a'])*(n-i+1);
a[s[i]-'a']=i;
}
cout<<sum;
return 0;
}