以cabcdec为例
讨论中间的c的贡献值
含中间c的子串有
abc
abcd
abcde
bc
bcd
bcde
c
cd
cde
假设前面的c为l,中间的c为p,后面的c为r,中间的c的贡献值就为 (p-l)*(r-p)
为了方便计算,对于每位字母,0位我们认为是最小的l,n+1位是最大的r
参考代码:
#include<bits/stdc++.h>
using namespace std;
string s;
pair<int,int> a[30];
int n;
long long sum;
int main() {
cin >> s;
s = '0' + s;
n = s.size() - 1;
for (int i = 1; i <= n; i++) {
auto find=a[s[i] - 'a'];
int l=find.first,p=find.second;
sum +=(p-l)*(i-p);
a[s[i] - 'a']={p,i};
}
for (int i = 0; i < 26; i++) {
int l=a[i].first,p=a[i].second,r=n+1;
if (p!=0) sum += (p-l)*(r-p);
}
cout << sum;
return 0;
}
0.0分
1 人评分
C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:
一点编程也不会写的:零基础C语言学练课程
解决困扰你多年的C语言疑难杂症特性的C语言进阶课程
从零到写出一个爬虫的Python编程课程
只会语法写不出代码?手把手带你写100个编程真题的编程百练课程
信息学奥赛或C++选手的 必学C++课程
蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程
手把手讲解近五年真题的蓝桥杯辅导课程
发表评论 取消回复