牛牛的字符对

牛牛的字符对

题目描述

牛牛有一个长度为n的字符串,牛牛想知道有多少对(i ,j,k)满足 1<=i < j < k<=n,且S[i] = S[j] = S[k]?由于答案可能很大,你只需输出答案对1e9+7取模。

输入格式

第一行,一个正整数n,代表字符串的长度(1<=n<=100000)

第二行,一个长度为n的字符串S(字符串仅由小写字母组成)。

样例

输入#1                                          输出#1

7                                                   5

abababa

题解:这一题题意比较简单,一看就知道可以三重for循环来做,结果WA了,仔细看一下可以知道,这个的长度太长了,肯定会TLE,这里我们可以用map来做,记录每一种字母出现的次数,然后利用排列组合即可,注意要取模。

代码:

#include<iostream>
#include<cstring>
#include<map>
#include<algorithm>
#define ll long long
using namespace std;
const ll mod=1e9+7;
int main(){
    int n;
    string ptr;
    cin>>n;
    cin>>ptr;
    map<char,ll> mp;
    for(int i=0;i<ptr.length();i++){
        mp[ptr[i]]++;//某一种有多少个 
    }
    map<char,ll>::iterator it;
    ll sum=0;
    for(it=mp.begin();it!=mp.end();it++){
        ll t=it->second;
        if(t>=3){
            sum=sum%mod+((t*(t-1)*(t-2))/6)%mod; 
        }
    }
    cout<<sum%mod<<endl;
    return 0;
}

 

 

 

posted @ 2020-04-16 10:10  TheIT  阅读(252)  评论(0编辑  收藏  举报