利用SG函数特性,和的SG函数等于单独SG函数的异或,然后对预处理SG函数

View Code
 1 #include<cstdio>
 2 #include<cstring>
 3 #include<algorithm>
 4 using namespace std;
 5 int sg[10005];
 6 bool mark[10005][105];
 7 int s[105];
 8 int main()
 9 {
10     int m;
11     while(scanf("%d",&m)&&m)
12     {
13         memset(mark,false,sizeof(mark));
14         for(int i=0;i<m;i++)
15             scanf("%d",s+i);
16         sg[0]=0;
17         for(int i=0;i<=10000;i++)
18         {
19             for(int j=0;j<=102;j++)
20             {
21                 if(!mark[i][j])
22                 {
23                     sg[i]=j;
24                     break;
25                 }
26             }
27             int tp=sg[i];
28             for(int j=0;j<m;j++)
29                 if(i+s[j]<=10000)
30                     mark[i+s[j]][tp]=true;
31 
32         }
33         scanf("%d",&m);
34         while(m--)
35         {
36             int flag=0;
37             int n,tp;
38             scanf("%d",&n);
39             while(n--)
40             {
41                 scanf("%d",&tp);
42                 flag^=sg[tp];
43             }
44             printf("%c",(flag!=0)?'W':'L');
45         }
46         printf("\n");
47     }
48     return 0;
49 }