题目链接: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;
}