
先将式子变形一下,变成长度乘上最小循环节个数,发现如果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;
}
浙公网安备 33010602011771号