题目描述
牛牛有一个长度为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; }