题解 | #abb#

abb

https://www.nowcoder.com/practice/0a8bbf8b9b5b4280957849ef4f240f07

// 假设abb序列 b的数量在序列中为cnt个

// 那么从cnt个字符任意选择两个 组合数为C(cnt,2)​=cnt∗(cnt−1)/2

#include<iostream>
using namespace std;

long long sum [100010][26];

int main(){
    int n;
    string s;
    cin >> n >> s;
  	// 后缀和数组 从右向左遍历 求对于每个字符后面有多少个不同的字母存在
    for(int i = n - 1; i >= 0; i --){
        for(int j = 0; j < 26; j ++){
            sum[i][j] = sum[i + 1][j];
        }
        sum[i][s[i] - 'a'] ++;
    }
    long long res = 0;
    for(int i = 0; i < n; i ++){
        for(int j = 0; j < 26; j ++){
		  // 如果cnt = 1 组合数就为 0 所以不算在res里面 如果大于等于2就组合数
            if(j != s[i] - 'a')
                res += sum[i + 1][j] * (sum[i + 1][j] - 1) / 2;
        }
    }
    cout << res << endl;
    return 0;
}

全部评论

相关推荐

评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务