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\n",ans);
    return 0;
}
posted @ 2020-04-16 10:28  QFNU-ACM  阅读(79)  评论(0编辑  收藏  举报