在队首插入a或在队尾插入b,求一下最大值,如此简单手残,用了15分钟
#include<bits/stdc++.h> using namespace std; char a[5500005]; int dp1[5500005],dp2[5500005]; unsigned long long ans1,ans2; int main(){ scanf("%s",a+1); int n=strlen(a+1); dp1[0]=1,dp2[n+1]=0; for(int i=1;i<=n;i++){ if(a[i]=='a')dp1[i]=dp1[i-1]+1; else dp1[i]=dp1[i-1]; } for(int i=n;i>=1;i--){ if(a[i]=='b')dp2[i]=dp2[i+1]+1; else dp2[i]=dp2[i+1]; } for(int i=1;i<=n;i++){ if(a[i]=='a')ans1+=dp1[i-1]*dp2[i+1]; } dp1[0]=0,dp2[n+1]=1; for(int i=1;i<=n;i++){ if(a[i]=='a')dp1[i]=dp1[i-1]+1; else dp1[i]=dp1[i-1]; } for(int i=n;i>=1;i--){ if(a[i]=='b')dp2[i]=dp2[i+1]+1; else dp2[i]=dp2[i+1]; } for(int i=1;i<=n;i++){ if(a[i]=='a')ans2+=dp1[i-1]*dp2[i+1]; } cout<<max(ans1,ans2); return 0; }