先将式子变形一下,变成长度乘上最小循环节个数,发现如果n大于等于7或等于1或4时不会出现比全取一种字母的价值大的情况,暴力枚举循环节,注意剪枝就能过,考试时写蠢了。。。
#include <stdio.h> #include <string.h> #include <algorithm> using namespace std; #define ll long long int const int maxn=100001; char s[maxn],st[maxn]; ll sum[3]; ll t,n,ans; ll check(ll y) { ll i,top=1,summ=0; for(i=1;i<=n;i++) { if(s[i]==st[top]) top++; if(top==y+1) { top=1; summ++; } } return y*summ*summ; } void dfs(ll x,ll y) { if(x==y+1) { ll temp=check(y); if(temp>ans) ans=temp; return; } ll i; for(i=0;i<=2;i++) { st[x]=i+'a'; dfs(x+1,y); } } int main() { scanf("%lld",&t); while(t--) { memset(sum,0,sizeof(sum)); scanf("%lld",&n); scanf("%s",s+1); ll i; for(i=1;i<=n;i++) sum[s[i]-'a']++; ll temp=(ll)max(sum[0],(ll)max(sum[1],sum[2])); ans=temp*temp; dfs(1,2); dfs(1,3); dfs(1,5); dfs(1,6); printf("%lld\n",ans); } return 0; }