1 条题解
-
0
前情提要:、放寒假后的第一篇题解。这道题不用什么高深的做法,只需要稍微在纸上写写画画就能找到规律。
从题目中得知,只要输入 O,前面的整句话都要被颠倒,我们一开始并不知道当前的字符到最后怎么样,所以我们需要用到一件法宝——正难反易(在一个十分令人喜爱的算法里常被用到),顾名思义倒着来一遍就好了。
从最后一个字符往前推,我们可以设一个变量,标记目前是否在被反转的状态,如果当前处于反转的状态,就把反转后的字母存下来,另一种情况不多说了。如果处理(该反转的反转)过后的字符是 O,那么变量也跟着变。这样一来,无论何时都能打出原字符串 。
哦,对了,Ta 说了只在 输出原字符串,反之不输出。所以,我们需要先设一个字符串 ,提前存下来,不要提前输出。
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
- 上传者