反正贴代码就对了
白书P138页
#include<iostream>
#include<sstream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<queue>
#include<stack>
#include<math.h>
#include<map>
#include<time.h>
#include<set>
#include<string>
#include<vector>
#include<algorithm>
using namespace std;
#define inf 0x7fffffff
#define lc l,m,index<<1
#define rc m+1,r,index<<1|1
#define max_n 4000005
#define mod 100000007
#define LL long long
#define max_log 20
char s[1000];
int n;
bool vis[max_n];
int sg[max_n];
void init()
{
sg[0]=0;
sg[1]=sg[2]=sg[3]=1;
for(int i=4;i<=200;i++)
{
memset(vis,0,sizeof(vis));
for(int j=3;j<=5;j++)
{
if(j<=i)
vis[sg[i-j]]=1;
}
for(int j=1;j<i-5;j++)
{
vis[sg[j]^sg[i-j-5]]=1;
}
for(int j=min(5,i);j>=3;j--)
vis[sg[i-j]]=1;
for(int j=0;;j++)
{
if(!vis[j])
{
sg[i]=j;
break;
}
}
}
}
int Nu[max_n];
int xx[max_n];
bool judge(int index,char s[])
{
int len=strlen(s);
int num=0;
int l=0,r=0;
s[index]='X';
for(int i=0;i<len;i++)
{
if(s[i]=='X')
{
r=i-2;
if(l<r)
xx[num++]=r-l;
l=i+3;
}
}
r=len;
if(l<r)
xx[num++]=r-l;
// printf("%d %d\n",l,r);
int flag=0;
for(int i=0;i<num;i++)
{
flag^=sg[xx[i]];
}
s[index]='.';
if(!flag) return 1;
else return 0;
}
int main()
{
init();
scanf("%d",&n);
for(int i=0;i<n;i++)
{
memset(vis,0,sizeof(vis));
int ans=0;
scanf("%s",s);
int len=strlen(s);
for(int j=0;j<len;j++)
{
if(s[j]=='X' && s[j+1]=='X' && j+1<len)
{
// printf("%d %d\n",j+1,len);
// printf("xxxx\n");
if(j>0)
{
// printf("zzzzzz\n");
if(vis[j-1]!=1 && s[j-1]!='X')
{
ans++;
vis[j-1]=1;
}
}
if(j+1<len-1)
{
// printf("xxvdgdgdg\n");
if(vis[j+2]!=1 && s[j+2]!='X')
{
ans++;
vis[j+2]=1;
}
}
}
if(s[j]=='X' && s[j+2]=='X' && j+2<len)
{
// printf("ddddd\n");
if(vis[j+1]!=1 && s[j+1]!='X')
{
ans++;
vis[j+1]=1;
}
}
}
if(ans!=0)
{
printf("WINNING\n");
for(int j=0;j<len;j++)
{
if(vis[j])
{
ans--;
if(ans)
printf("%d ",j+1);
else
printf("%d\n",j+1);
}
}
continue;
}
for(int j=0;j<len;j++)
{
if(s[j]=='X')continue;
if(j-1>=0 && s[j-1]=='X')continue;
if(j-2>=0 && s[j-2]=='X')continue;
if(j+1<len && s[j+1]=='X') continue;
if(j+2<len && s[j+2]=='X') continue;
if(judge(j,s))Nu[ans++]=j+1;
}
if(ans)
{
printf("WINNING\n");
for(int j=0;j<ans;j++)
{
printf("%d%c",Nu[j],j==ans-1?'\n':' ');
}
}
else
{
printf("LOSING\n\n");
}
}
return 0;
}