超简单问题,悬关,求助大佬
  • 板块灌水区
  • 楼主YFF1
  • 当前回复2
  • 已保存回复2
  • 发布时间2024/10/12 22:29
  • 上次更新2024/10/13 10:07:40
查看原帖
超简单问题,悬关,求助大佬
1046636
YFF1楼主2024/10/12 22:29

是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;
}
2024/10/12 22:29
加载中...