题解:P11526 [THUPC 2025 初赛] Imyourfan

· · 题解

好久没有这么酣畅淋漓的分讨过了。依我看这坨仍是史中史。

上一次抑郁成这样还是这个。

错的点主要是细节不到位和复制导致的输出写错。

我的锅,我对不起队伍。

但咱就是说这什么运气一开赛就开这题创似了呢……

首先可以把 \texttt{X} 视作分割线,将原字符串砍成若干段不含 \texttt{X} 的字符串。

注意到卡片是一段一段取走的,所以对于一段连续的 \texttt{M\dots M}\texttt{W\dots W} 可以直接压缩成为等价的 \texttt{M}\texttt{W}

对于处理后的字符串,我们发现两人轮流对其进行操作一个回合后,固定会消除一对 \texttt{MW} 或者 \texttt{WM}

据此我们可以进一步转化:

然后分别统计六种字符串的数量,记为 a_0,a_1,a_2,a_3,a_4,a_5

具体做法:

    for(int i=1;i<s.size();i++){
        if(s[i]=='X'){
            if(x.size()==0)continue;
            if(x[0]==x[x.size()-1]){
                if(x[0]=='M'&&x.size()==1)a[0]++;
                else if(x[0]=='M')a[4]++;
                else if(x.size()!=1)a[5]++;
                else a[1]++;
            }else{
                if(x[0]=='M')a[2]++;
                else a[3]++;
            }
            x="";
        }else if(s[i]!=s[i-1])x+=s[i];
    }

我们还要明确一下这些值的意义。

    int flc=min(a[0],a[1]);
    a[0]-=flc;
    a[1]-=flc;

我们令 a_0,a_1 重新赋值为处理后的结果。

那么接下来我们可以开始分讨了。

分讨完成!

代码:

#include<bits/stdc++.h>
#define int long long
using namespace std;
void solve(){
    string s;
    cin>>s;
    string x;
    x+=s[0];
    s+='X';
    if(x=="X")x="";
    int top=0;
    int a[6]={};//M W MW WM MWM WMW 
    for(int i=1;i<s.size();i++){
        if(s[i]=='X'){
            if(x.size()==0)continue;
            if(x[0]==x[x.size()-1]){
                if(x[0]=='M'&&x.size()==1)a[0]++;
                else if(x[0]=='M')a[4]++;
                else if(x.size()!=1)a[5]++;
                else a[1]++;
            }else{
                if(x[0]=='M')a[2]++;
                else a[3]++;
            }
            x="";
        }else if(s[i]!=s[i-1])x+=s[i];
    }
//  cout<<a[0]<<' '<<a[1]<<' '<<a[2]<<' '<<a[3]<<' '<<a[4]<<' '<<a[5]<<'\n';
    int flc=min(a[0],a[1]);
    a[0]-=flc;
    a[1]-=flc;
    if(a[0]){
        if(a[5]<a[0]+a[4]||a[5]==a[0]+a[4]&&a[4]==0){
            puts("Water");
            return;
        }else if(a[5]==a[0]+a[4]+1||a[5]==a[0]+a[4]){
            puts("Draw");
            return;
        }else{
            puts("Menji");
            return;
        }
    }else if(a[1]){
        a[1]--;
        if(a[1]){
            if(a[4]<a[1]+a[5]||a[4]==a[1]+a[5]&&a[5]==0){
                puts("Menji");
            return;
            }else if(a[4]==a[1]+a[5]+1||a[4]==a[1]+a[5]){
                puts("Draw");
            return;
            }else{
                puts("Water");
            return;
            }
        }else{
            if(!a[4]&&!a[5]){
                puts("Menji");
            return;
            }else if(a[4]<a[5]){
                puts("Menji");
            return;
            }else if(a[4]==a[5]+1||a[4]==a[5]){
                puts("Draw");
            return;
            }else{
                puts("Water");
            return;
            }
        }
    }else{
        if(!a[4]&&!a[5]){
            puts("Water");
            return;
        }else if(a[4]>a[5]){
            puts("Water");
            return;
        }else if(a[4]+1==a[5]||a[4]==a[5]){
            puts("Draw");
            return;
        }else{
            puts("Menji");
            return;
        }
    }
}
signed main(){
    int t;
    cin>>t;
    while(t--){
        solve();
    }
    return 0;
}
//WXWXMMWMXMWMXMWWMMX

疑似全世界最繁琐的做法。

循 序 渐 进。

诶话说为什么总觉得 a_5 被我写的跟只鸡一样()