题目链接:https://vjudge.net/problem/32209/origin
题目大意:
#include<bits/stdc++.h>
#define LL long long
using namespace std;
int sg[205];
bool vis[205];
struct node{
int L;
int Len;
}a[500];
void get_sg(int n){
for(int i=4; i<=n; i++){
memset(vis, 0, sizeof(vis));
for(int k=1; k<=i; k++){
int L=max(0, k-3);
int R=max(0, i-L-2-min(k, 3));
//cout<<L<<" "<<R<<endl;
vis[sg[L]^sg[R]]=1;
}
for(int j=0; j<=n; j++){
if(!vis[j]){
sg[i]=j;
break;
}
}
//cout<<i<<" "<<sg[i]<<endl;
}
}
set<int> st;
int main()
{
//cout<<(1^2)<<endl;
sg[0]=0; sg[1]=sg[2]=sg[3]=1;
get_sg(200);
char c[205];
int t;scanf("%d", &t);
while(t--){
st.clear();
scanf("%s", c+1);
int n=strlen(c+1), tot=1;
int L=0, f=0;
for(int i=1; i<=n; i++){
if(c[i]=='X'){
if(L==0){
L=i;
}
else{
int Len=i-L-1;
if(Len==0){
f=1;
if(i-2>=1){
st.insert(i-2);
}
if(i+1<=n){
st.insert(i+1);
}
}
else if(Len==1){
f=1;
st.insert(i-1);
}
else if(Len>4){
Len=i-L-5;
a[tot].L=L+3;
a[tot].Len=Len;
//cout<<a[tot].L<<" "<<Len<<endl;
tot++;
}
L=i;
}
}
}
if(L==0){
a[tot].L=1;
a[tot].Len=n;
tot++;
}
else{
int i=0;
while(c[i]!='X'){
i++;
}
int Len=i;
if(Len>3){
a[tot].L=1;
a[tot].Len=Len-3;
tot++;
}
i=n;
while(c[i]!='X'){
i--;
}
Len=n-i;
if(Len>2){
a[tot].L=i+3;
a[tot].Len=Len-2;
tot++;
}
}
if(f){
printf("WINNING\n");
set<int>::iterator p=st.begin();
for(; p!=st.end(); p++){
if(++p==st.end()){
printf("%d\n", *(--p));
}
else{
p--;
printf("%d ", *p);
}
}
}
else{
int ans=0;
for(int i=1; i<tot; i++){
ans^=sg[a[i].Len];
}
if(ans){
printf("WINNING\n");
for(int i=1; i<tot; i++){
for(int k=1; k<=a[i].Len; k++){
int s=ans^sg[a[i].Len];
int L=max(0, k-3);
int R=max(0, a[i].Len-L-2-min(k, 3));
s=s^sg[L]^sg[R];
if(s==0)
st.insert(k+a[i].L-1);
}
}
set<int>::iterator p=st.begin();
for(; p!=st.end(); p++){
if(++p==st.end()){
printf("%d\n", *(--p));
}
else{
p--;
printf("%d ", *p);
}
}
}
else{
printf("LOSING\n\n");
}
}
}
return 0;
}