HDU 1536/1944 求SG值(走法不任意)

来源:互联网 发布:ai编程语言 编辑:程序博客网 时间:2024/06/02 15:16
#include<stdio.h>  #include<string.h>  #include<stdlib.h>  int  s[101];  int sg[10001];     int g(int temp , int k)  {      int mex[101],i;      memset(mex,0,sizeof(mex));      if(sg[temp]!=-1) return sg[temp]; //集合S一致,则每个数量的mex一样,所以可以重复利用    if(temp-s[0]<0) return sg[temp]=0; //s[0]为集合中最小值,temp-s[0]<0,则temp不可能到达其他状态,一定为P         for(i=0;i<k && temp-s[i]>=0;i++)  //判断条件,因为s[]排了序,当temp-s[i]<0就停止循环。     {           mex[g(temp-s[i] , k)]=1;  //temp的后继SG函数中的没有出现的最小非负数         }      for(i=0;;i++) //通过temp的后继SG函数出现的非负数得temp的结果      if(!mex[i])  return sg[temp]=i;  }   int comp(const void *a,const void *b){return *(int *)a-*(int *)b;} int main()  {      int  k,i ;      int n, t ,temp, ans; //freopen("in.txt","r",stdin);    while(scanf("%d",&k)!=EOF && k)      {          memset(sg,-1,sizeof(sg));          sg[0]=0;          for(i=0;i<k;i++) scanf("%d",&s[i]);          qsort(s,k,sizeof(int),comp);          scanf("%d",&t);           while(t--)          {              ans=0;              scanf("%d",&n);              for(i=0;i<n;i++)               {                  scanf("%d",&temp);                    ans^=g(temp , k);              }                         if(!ans)  printf("L"); //异或sum!=0,说明该点为必败点,只能到达必胜点。                 else printf("W");          }          printf("\n");      }      return 0;  }