用sg函数对每组数据中所有的数处理。。得到的结果异或。为0必输。。否则必胜
#include<iostream>
//#include<algorithm>
#include<set>
#include<cstdio>
using namespace std;
//const int MAXK=102;
const int MAXM=102;
//const int MAXL=102;
const int MAXH=10002;
set<int>de;
int dp[MAXH];
inline int sg(int cur)
{
if(dp[cur]!=-1)
{
return dp[cur];
}
int i;
set<int>::const_iterator cp;
bool visited[MAXM];
memset(visited,0,sizeof(visited));
if(cur==0)
{
return dp[cur]=0;
}
bool tag=0;
for(cp=de.begin();cp!=de.end();cp++)
{
if(cur-*cp>=0)
{
int r;
if(dp[cur-(*cp)]!=-1)
{
r=dp[cur-(*cp)];
}else
{
r=sg(cur-(*cp));
}
if(r==0)
{
tag=1;
}
//cout<<r<<" ";
visited[r]=1;
}else
{
break;
}
}
i=0;
int mex;
if(tag)
{
int j=0;
while(visited[j])
{
j++;
}
return dp[cur]=j;
}else
{
return dp[cur]=0;
}
}
int main()
{
int k;
while(scanf("%d",&k)!=EOF)
{
memset(dp,-1,sizeof(dp));
de.clear();
if(k==0)
{
break;
}
int i;
for(i=0;i<=k-1;i++)
{
int s;
scanf("%d",&s);
de.insert(s);
}
int m;
scanf("%d",&m);
bool result[MAXM];
/*for(i=0;i<=10000;i++)
{
sg(i);
}*/
for(i=0;i<=m-1;i++)
{
int l;
scanf("%d",&l);
int j=0;
int sum=0;
for(j=0;j<=l-1;j++)
{
int heap;
scanf("%d",&heap);
sum=sum^sg(heap);
}
if(sum)
{
result[i]=1;
}else
{
result[i]=0;
}
}
for(i=0;i<=m-1;i++)
{
if(result[i])
{
printf("W");
}else
{
printf("L");
}
}
printf("\n");
}
return 0;
}