1 条题解

  • 0
    @ 2026-5-28 17:11:07

    前情提要:299216{\color{Red}299}\rightarrow{\color{Orange}216}、放寒假后的第一篇题解。

    这道题不用什么高深的做法,只需要稍微在纸上写写画画就能找到规律。

    从题目中得知,只要输入 O,前面的整句话都要被颠倒,我们一开始并不知道当前的字符到最后怎么样,所以我们需要用到一件法宝——正难反易(在一个十分令人喜爱的算法里常被用到),顾名思义倒着来一遍就好了。

    从最后一个字符往前推,我们可以设一个变量,标记目前是否在被反转的状态,如果当前处于反转的状态,就把反转后的字母存下来,另一种情况不多说了。如果处理(该反转的反转)过后的字符是 O,那么变量也跟着变。这样一来,无论何时都能打出原字符串 SS

    哦,对了,Ta 说了只在 k=1k=1 输出原字符串,反之不输出。所以,我们需要先设一个字符串 tt,提前存下来,不要提前输出。

    AC Code:

    #include<bits/stdc++.h>
    using namespace std;
    string s;
    int T,k,n;
    void solve (){
        cin>>n>>s;
        int around=0;
        string t="";
        for (int i=n-1; i>=0; i--){
            if (around){
                if (s[i]=='M'){
                    t='O'+t;
                    around=(around+1)%2;
                } else t='M'+t;
            } else {
                if (s[i]=='O'){
                    t='O'+t;
                    around=(around+1)%2;
                } else t='M'+t;
            }
        }
        cout<<"YES\n";
        if (k){
            cout<<t<<"\n";
        }
    }
    int main(){
        cin>>T>>k;
        while (T--){
            solve ();
        }
        return 0;
    }
    

    完结撒花~

    (祝大家新年快乐,假期快乐,作业早早写完)

    • 1

    信息

    ID
    5475
    时间
    2000ms
    内存
    256MiB
    难度
    9
    标签
    递交数
    27
    已通过
    4
    上传者