/************************************************
┆ ┏┓ ┏┓ ┆
┆┏┛┻━━━┛┻┓ ┆
┆┃ ┃ ┆
┆┃ ━ ┃ ┆
┆┃ ┳┛ ┗┳ ┃ ┆
┆┃ ┃ ┆
┆┃ ┻ ┃ ┆
┆┗━┓ ┏━┛ ┆
┆ ┃ ┃ ┆
┆ ┃ ┗━━━┓ ┆
┆ ┃ AC代马 ┣┓┆
┆ ┃ ┏┛┆
┆ ┗┓┓┏━┳┓┏┛ ┆
┆ ┃┫┫ ┃┫┫ ┆
┆ ┗┻┛ ┗┻┛ ┆
************************************************ */
#pragma warning (disable:4996)
#include<iostream>
#include<algorithm>
#include<string>
#include<cmath>
#include<cstdio>
#include<cstring>
#include<string>
#include<queue>
#include<set>
#include<map>
#include<stack>
#include<cstdlib>
#include<functional>
using namespace std;
typedef long long ll;
#define INF 0x3f3f3f3f
const int maxn = 1e4 + 10;
//f[]:可以取走的石子个数
//sg[]:0~n的SG函数值
//mex[]:mex{}
int f[maxn], sg[maxn], mex[maxn];
void getSG(int n,int k)
{
int i, j;
memset(sg, 0, sizeof(sg));
for (i = 1; i <= n; i++)
{
memset(mex, 0, sizeof(mex));
for (j = 1;j<=k && f[j] <= i ; j++)
mex[sg[i - f[j]]] = 1;
for (j = 0; j <= n; j++) //求mes{}中未出现的最小的非负整数
{
if (!mex[j])
{
sg[i] = j;
break;
}
}
}
}
//int pile[maxn];
int main()
{
int k;
while (scanf("%d", &k) && k)
{
for (int i = 1; i <= k; i++) scanf("%d", &f[i]);
sort(f+1, f + k+1);
getSG(10000, k);
int m;
scanf("%d", &m);
for (int i = 1; i <= m; i++)
{
int ans = 0;
int p;
int nmax = 0;
scanf("%d", &p);
for (int j = 0; j < p; j++)
{
int x;
scanf("%d", &x);
ans ^= sg[x];
}
if (ans) printf("W");
else printf("L");
}
printf("\n");
}
return 0;
}
注意f[]数组要排序,然后getsg函数里面的第二层循环有j<=k