题解 | #abb#
abb
https://www.nowcoder.com/practice/0a8bbf8b9b5b4280957849ef4f240f07
//从后向前遍历字符串
//dp表示当前字符之前能配对的总个数
//dp[i+1] = dp[i] + sum
//其中,sum就是当前这个字符能配对abb的个数
//sum = C_n_2
//path记录了26个字母重复的次数,随着i而更新
//需要注意的是int会溢出,所以用long long
#include <iostream>
#include <vector>
using namespace std;
long long cn2(int n){
long long a22 = 2, an2 = n*(n-1);
return an2/a22;
}
int main() {
int n;
cin>>n;
string str;
cin>>str;
if(n<3){
cout<<0;
return 0;
}
vector<long long> path(26,0);//代表的是第i个下标后各字母的数量,从后向前
vector<long long> dp(n+1,0);//从后向前到达第i个下标时,abb型字符串的数目
int start = str.size()-1;
for(int i=0;i<str.size();++i){
int c = str[start-i] - 97;
//cout<<str[start-i]<<endl;
long long sum = 0;
for(int j=0;j<26;++j){
if(j!=c)sum = sum + cn2(path[j]);
}
//cout<<sum<<endl;
dp[i+1] = dp[i] + sum;
++path[c];
}
cout<<dp[n];
return 0;
}
// 64 位输出请用 printf("%lld")
查看18道真题和解析
