样例输入
ababc
样例输出
28
样例说明
子串 f值
a 1
ab 2
aba 2
abab 2
ababc 3
b 1
ba 2
bab 2
babc 3
a 1
ab 2
abc 3
b 1
bc 2
c 1
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
int main()
{
int last[31]={0};
string s;
cin>>s;
ll sum=0;
int n=s.size();
ll f[n]={0};
for(ll i=1;i<=n-i+1;i++)
f[i]=f[n-i+1]=i*(n-i+1);
for(int i=1;i<=n;i++)
{
int t=s[i-1]-'a'+1;
if(!last[t])
sum+=f[i];
else
sum+=f[i]-f[i]*last[t]/i;
last[t]=i;
}
cout<<sum;
}
//有参考,具体思想就是计算每个字母的贡献,出现重复的时候贡献就不会像没有重复的时候那么多
//就是要计算重复的字符上一次出现的位置,这个位置以前的所有贡献都是没用的,要减去,称为去重过程。
//我说不清楚,我把我参考的贴在这里,需要的时候再去看吧
参考的文章