4.16 每日一题题解

牛牛的字符对

涉及知识点:

  • 排列组合

solution:

  • (找到所有的S[i] = S[j] = S[k],满足 1<=i < j < k<=n)
  • (最简单的做法,统计相同字母的个数,遍历a - z)
  • (比如一共5个 a,那么 a 字母产生贡献 = C(5 , 3),即5个字母任取3个)
  • (也可以直接遍历字符串,假设当前字母是 c ,之前有3个 c 字母)
  • (那字母 c 可以和前面任意2个 c 字母组合,即C(3,2),如果再次遍历到 c ,即C(4,2))

std:

#include <bits/stdc++.h>
using namespace std;
#define ll long long
const int maxn = 100005;
const ll mod = 1e9 + 7;
char s[maxn];
ll a[30];
int main()
{
    int n;
    ll ans = 0;
    scanf("%d",&n);
    scanf("%s",s+1);
    for(int i=1;i<=n;i++){
        a[s[i]-'a']++;
    }
    for(int i=0;i<26;i++){
        if(a[i] >= 3)
            ans += (a[i]*(a[i]-1)*(a[i]-2)/6)%mod,ans %= mod;
    }
    printf("%lld
",ans);
    return 0;
}
原文地址:https://www.cnblogs.com/QFNU-ACM/p/12710981.html