题目:蓝桥杯2020年第十一届省赛真题-子串分值和 - C语言网 (dotcpp.com)
*定义一下计算贡献:
ababc中第一个a所做的贡献为 :a(ababc)、ab(ababc)
ababc中第二个a所做的贡献为 :aba(ababc)、abab(ababc)、ababc(ababc)、ba(ababc)、bab(ababc)、babc(ababc)、a(ababc)、ab(ababc)、abc(ababc)
思路:按如上方法算出每个字母的贡献,可得:
序号 | 1 | 2 | 3 | 4 | 5 |
字母 | a | b | a | b | c |
贡献 | 2 | 4 | 9 | 8 | 5 |
于是可以找个规律:贡献=序号*(下一个重复字符序号(无重复字符就是字符串长度)-序号)
a:2=1*(3-1)
b:4=2*(4-2)
a:9=3*(6-3)
b:8=4*(6-4)
c:5=5*(6-5)
代码如下所示:(下面代码从0开始,所以乘的时候有 t+1,同时注意long long !! )
#include<bits/stdc++.h>
#define int long long
using namespace std;
signed main()
{
string s;cin>>s;
int sum=0;
for(int t=0;t<s.size();t++){
int right;
for(right=t+1;right<s.size();right++){
if(s[t]==s[right])break;
}
sum=sum+(t+1)*(right-t);
}
cout<<sum;
return 0;
}