ZJU3084

/*
1AC的感觉还是比较美妙的

博弈问题,关键要知道sg函数的本质,根据定义计算出sg函数值,就可以转化为普通的Nim游戏了

还算比较简单吧。
*/

#include <cstdio>
#include <cstdlib>
#include <vector>
#include <cstring>
#include <algorithm>
using namespace std;

int K,S[10010];
int M;
vector<int> d[110];
int N;
int sg[10010];
bool vis[10010];
int ans[110],top;

int main()
{
	freopen("in.txt","r",stdin);
	freopen("out.txt","w",stdout);
	while(scanf("%d",&K)==1)
	{
		if(K==0) break;
		for(int i=0;i<K;i++)
		{
			scanf("%d",S+i);
		}

		//
		int tmp,Max = 0;
		scanf("%d",&M);
		for(int i=0;i<M;i++)
		{
			scanf("%d",&N);
			d[i].clear();
			for(int j=0;j<N;j++)
			{
				scanf("%d",&tmp); d[i].push_back( tmp );
				Max = max(tmp,Max);
			}
		}

		//
		sort(S,S+K);
		sg[0] = 0;
		for(int i=1;i<=Max;i++)
		{
			memset(vis,0,sizeof(vis));
			for(int j=0;j<K;j++)
			{
				if( S[j]<=i )
				{
					vis[sg[i-S[j]]] = 1;
				}
				else break;
			}
			for(int j=0;j<=Max;j++)
			{
				if( !vis[j] )
				{
					sg[i] = j;break;
				}
			}
		}

		//
		top = 0;
		for(int i=0;i<M;i++)
		{
			int tp = 0;
			for(int j=d[i].size()-1;j>=0;j--)
			{
				tp ^= sg[ d[i][j] ];
			}
			if( tp ) ans[top++] = 1;
			else ans[top++] = 0;
		}

		//
		for(int i=0;i<top;i++)
		{
			ans[i]?printf("W"):printf("L");
		}
		printf("\n");
	}
	return 0;
}
posted @ 2011-06-14 00:35  AC2012  阅读(139)  评论(0编辑  收藏  举报