题目描述:该开始没看懂别人的题解,后来耐下心仔细看总算有所收获,下面是我加了一些自己的理解后写的代码
#include<bits/stdc++.h>
using namespace std;
char str[100005];
long long pre[100005];
int main(){
long long sum;
cin>>str+1;
//str="0"+str;
int m=strlen(str+1);
for(int i=1;i<=m;i++){
sum+=(i-pre[str[i]-'a'])*(m-i+1);
pre[str[i]-'a']=i;
}
cout<<sum;
}
/*计算当前这个字符对整个字符串有多少贡献,
如果它还没出现过,那就是对整个字符串都有贡献,
不然它只对上一次出现之后的排列做出了贡献
假如i=1,且第一次出现,则sum+=1*它后面的长度。
假如i=6,且这个字符在i=3,出现,则sum+=3*上一次出现之后的字符长度。
opababc,则第二个a做出贡献的字符串为babc的排列,
在babc之前的排列已经被第一个a做过了贡献。
ababc 计算字符串每个字符对整体的贡献 i-pre[str[i]-'a']左边可能的情况数,m-i+1右边可能的情况数
1 5 a ab aba abab ababc
2 4 (ab aba abab ababc) (b ba bab babc)
2 3 (ba bab babc) (a ab abc)
2 2 (ab abc) (b bc)
5 1 (ababc babc abc bc c)
*/