关键点在于怎么算贡献值!!
参考题解:【2020蓝桥杯省赛】【字符串】子串分值(详解!)(两种解法)_Not Today!的博客-CSDN博客_子串分值
题目:蓝桥杯2020年第十一届省赛真题-子串分值 - C语言网 (dotcpp.com)
那么如何用数学的方法计算出来贡献值呢?
这些子串的起点可以为1、2、3,终点可以为3、4,即(3-0)*(5-3) = 6
其中0是3号b往左遇到的第一个b的标号,而5是3号b往右遇到的第一个b的标号。
推论:一个字符(位置为i)的影响范围由其往左边遍历遇到的第一个相同字符(位置为left)和其往右边遍历遇到的第一个相同字符(位置为right)所决定。其贡献值为(i - left)*(right - i)
[详见题解链接,真的很详细]
#include<bits/stdc++.h>
using namespace std;
#define int long long
string s;
signed main()
{
cin>>s;long long sum=0;
for(int t=0;t<s.size();t++){
int right,left;
for(right=t+1;right<s.size();right++){
if(s[right]==s[t])break;
}
for(left=t-1;left>=0;left--){
if(s[left]==s[t])break;
}
sum+=(t-left)*(right-t);
}
cout<<sum<<endl;
return 0;
}