clearlove


私信TA

用户名:gxl7

访问量:1270

签 名:

等  级
排  名 2422
经  验 2231
参赛次数 4
文章发表 5
年  龄 0
在职情况 学生
学  校 河北农业大学
专  业

  自我简介:

解题思路:

我们可以通过求每个字符对数列的贡献度来解决问题,比如对于字符串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分

11 人评分

看不懂代码?想转换其他语言的代码? 或者想问其他问题? 试试问问AI编程助手,随时响应你的问题:

编程语言转换

万能编程问答  

代码解释器

代码纠错

SQL生成与解释

  评论区

妙啊妙啊
2023-03-16 11:10:03
这思路太牛
2022-04-07 17:21:19
大佬啊,能请教一下,你的这个推导思路怎么来的吗?
2022-04-02 16:05:52
  • «
  • 1
  • »