解题思路:

我们可以通过求每个字符对数列的贡献度来解决问题,比如对于字符串ababc,第一个字符a的贡献度为5,因为它在五个字符串中出现了;而对于第二个a它一共在6个字符串中出现,所以它的贡献度为6.每个字符的贡献度都是等于该字符距离上一个和它一样的字符之间的个数乘以它到字符串末尾的个数。

比如第二个a的贡献度=(2-0)*3=6;

这五个字符每个字符的贡献度分别为:

a: 5//因为它是第一个所以贡献度就是字符串的长度

b: 2*4=8//因为在它之前没有b

a:(2-0)*3=6

b: (3-1)*2=4;

c: 5*1=5;

所以正好加起来等于28;

注意事项:

参考代码:

#include<iostream>
#include<cstring>
using namespace std;
typedef long long ll;
int main()
{
string s;
cin>>s;
ll total=0;
int a[26];    //用于存放该字符上一次在字符串中的位置
memset(a,-1,sizeof(a)); 
a[s[0]-'a']=0;
total+=s.size(); 
for(int i=1;i<s.size();i++){
total+=(i-a[s[i]-'a'])*(s.size()-i);
a[s[i]-'a']=i;
}
cout<<total;
  return 0;
}


点赞(0)
 

0.0分

8 人评分

C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:

一点编程也不会写的:零基础C语言学练课程

解决困扰你多年的C语言疑难杂症特性的C语言进阶课程

从零到写出一个爬虫的Python编程课程

只会语法写不出代码?手把手带你写100个编程真题的编程百练课程

信息学奥赛或C++选手的 必学C++课程

蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程

手把手讲解近五年真题的蓝桥杯辅导课程

评论列表 共有 6 条评论

2205符琼方 1年前 回复TA
妙啊妙啊
gw 2年前 回复TA
这思路太牛
clearlove 2年前 回复TA
@恐怖如斯 纵向看他给的提示
Acmer 2年前 回复TA
@恐怖如斯 +1
fishbone 2年前 回复TA
@恐怖如斯 太棒了
恐怖如斯 2年前 回复TA
大佬啊,能请教一下,你的这个推导思路怎么来的吗?