P10058 题解

这种翻转的题明显已经做烂了好吧……

首先显而易见,翻转偶数次对结果没有影响,只需要考虑奇数次翻转的情况。

由于是整体移动的操作,可以抓住一个点来移动,然后还原出原来的序列。

例如先将选择的点设为 $x$,进行 > 2 的操作就将 $x+2$,< 3 的操作就将 $x-3$,但是减法会 $< 0$,由于是环形的,直接 $+\left| S \right|$就行,其中 $\left| S \right|$ 表示字符串 $S$ 的长度。

需要注意的是字符串是环形移动,因此如果当前点的位置大于字符串长度,要对字符串的长度进行取余操作。

写的时候注意细节。

代码

#include<bits/stdc++.h>
using namespace std;
int main(){
    string a;
    cin>>a;
    int len=a.size();
    int n,f=0,x=1;
    cin>>n;
    while(n--){
        string op;
        cin>>op;
        if(op=="rev") f++,x=len-x+1;//累加rev的次数 
        if(op==">"){
            int s;
            cin>>s;
            s%=len;//取余 
            x+=s;
            x%=len;//取余 
        }
        if(op=="<"){
            int s;
            cin>>s;
            s%=len;//取余 
            x+=len,x-=s;
            x%=len;//取余 
        }
    }
    //还原字符串 
    if(f%2==1){
        string p1=a.substr(x,len-x+1);//使用substr 
        string p2=a.substr(0,x);
        reverse(p1.begin(),p1.end());//奇数次要翻转 
        reverse(p2.begin(),p2.end());
        a=p2+p1;
        cout<<a;
    }
    else{//偶数次没有翻转操作 
        string p1=a.substr(0,len-x+1);
        string p2=a.substr(len-x+1,x);
        a=p2+p1;
        cout<<a;
    }
    return 0;
}
posted @ 2024-01-16 12:15  very_easy  阅读(14)  评论(0)    收藏  举报  来源