是ABC375的D题,有一种比较奇葩的解法,但是没有通过第三个样例,求调
#include<bits/stdc++.h>
using namespace std;
#define int long long
string s;
int n,dp[200005][50],pos[200005][50],fa[50],sum[50],cnt[200005],ans=0,score[50],c[200005][5];
int get(char c){
return c-64;
}
signed main () {
cin>>s;
n=s.size();
s=" "+s;
c[0][0]=1;
c[1][0]=c[1][1]=1;
for(int i=2;i<=n;i++){
c[i][0]=1;
for(int j=1;j<=3;j++)c[i][j]=(c[i-1][j]+c[i-1][j-1]);
}
for(int i=1;i<=n;i++){
score[get(s[i])]++;
for(int j=1;j<=26;j++){
dp[i][j]=dp[i-1][j];
if(get(s[i])==j)dp[i][j]++;
else cnt[i]+=dp[i][j];
}
pos[fa[get(s[i])]][get(s[i])]=i;
fa[get(s[i])]=i;
}
for(int i=1;i<=n;i++){
int j=get(s[i]);
int k=pos[i][j];
if(k==0)continue;
int tot=cnt[k]-cnt[i];
int tmp=sum[j]+tot;
sum[j]+=tmp;
// cout<<s[i]<<" "<<k<<" "<<tot<<" "<<sum[j]<<endl;
}
for(int i=1;i<=26;i++){
ans+=sum[i];
ans+=c[score[i]][3];
// cout<<score[i]<<endl;
}
cout<<ans;
return 0;
}