题解 | #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")

全部评论

相关推荐

评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务