2018-3-23模拟考试 字符串

Posted on 2018-03-29 23:22  SirKnight  阅读(115)  评论(1)    收藏  举报

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