
计算每个字母对其所在子串的贡献值,如子串bacbacdb中第四个字母b对其所能提供贡献值的子串为:acb\acba\acbac\acbacd;cb\cba\cbac\cbacd;b\ba\bac\bacd。观察可得其贡献值就等于其到前面一个相同字母的距离+1(因为前面字母与其本身都可以作为被贡献子串的开头)乘以后面一个相同字母的距离+1(因为后面字母与其本身都可以作为被贡献子串的结尾)。
#include <iostream>
#include <string>
using namespace std;
int main()
{
string s;
cin>>s;
int len = s.size();
int res = 0;
for(int i = 0; i < len; i++){
int left = 0, right = 0;
for(int j = i - 1; j >= 0; j--){
if(s[j] != s[i]){
left++;
}
else break;
}
for(int k = i + 1; k < len; k++){
if(s[k] != s[i]){
right++;
}
else break;
}
res += (left + 1) * (right + 1);
}
cout<<res<<endl;
return 0;
}
1574

被折叠的 条评论
为什么被折叠?



