记录编号 37065 评测结果 AAAAAAAA
题目名称 分球 最终得分 100
用户昵称 GravatarCzb。 是否通过 通过
代码语言 C++ 运行时间 0.550 s
提交时间 2012-03-23 11:47:30 内存使用 41.26 MiB
显示代码纯文本
#include<stdio.h>
#include<string.h>

struct orz
{
	int k,s,x,y;
	char c[15];
	orz()
	{
		k=s=x=y=0;
		memset(c,0,sizeof(c));
	}
}qu[500001];

int q,n,l,t,ans,aa[500001],last[5000001];

char *c;

bool flag[5000001];

int val(orz a)
{
	int k=1,s=0;
	for(int i=n-1;i>0;i--)
	{
		if(a.c[i]=='a')
		{
			s+=k;
		}
		else if(a.c[i]=='b')
		{
			s+=k*2;
		}
		k*=3;
	}
	return s;
}

bool solve(orz a)
{
	int i,x,y;
	x=0;
	y=n>>1;
	y--;
	for(i=0;i<n;i++)
	{
		if(a.c[i]=='a')
			x++;
		else if(a.c[i]=='b'&&x<y)
			return false;
	}
	return true;
}

int main(int argc,char *argv[])
{
	freopen("balls.in","r",stdin);
	freopen("balls.out","w",stdout);
	int i,l,r;
	orz tmp;
	c=new char[15];
	scanf("%d",&q);
	while(q--)
	{
		memset(flag,1,sizeof(flag));
		memset(last,0,sizeof(last));
		scanf("%d\n",&n);
		n<<=1;
		scanf("%[ ab]",c);
		l=strlen(c);
		if(l<n)
		{
			c[-1]=c[-2]=' ';
			c=c-2;
		}
		strcpy(tmp.c,c);
		for(i=0;i<n;i++)
		{
			if(c[i]==' ')
			{
				tmp.x=i;
				tmp.y=++i;
			}
		}
		tmp.k=val(tmp);
		flag[tmp.k]=false;
		l=r=1;
		qu[1]=tmp;
		while(l<=r)
		{
			tmp=qu[l];
			if(solve(tmp))
			{
				ans=l;
				break;
			}
			for(i=0;i<n-1;i++)
			{
				if(tmp.c[i]!=' '&&tmp.c[i+1]!=' ')
				{
					orz temp=tmp;
					temp.c[temp.x]=temp.c[i];
					temp.c[temp.y]=temp.c[i+1];
					temp.c[i]=' ';
					temp.c[i+1]=' ';
					temp.x=i;
					temp.y=i+1;
					temp.k=val(temp);
					temp.s=tmp.s+1;
					if(flag[temp.k])
					{
						flag[temp.k]=false;
						qu[++r]=temp;
						last[r]=l;
					}
				}
			}
			l++;
		}
		if(ans)
		{
			t=0;
			while(ans)
			{
				t++;
				aa[t]=ans;
				ans=last[ans];
			}
			for(i=t;i>0;i--)
			{
				printf("%d %s\n",t-i,qu[aa[i]].c);
			}
		}
		else
			printf("NO SOLUTION\n");
		printf("\n");
	}
	return 0;
}