这种翻转的题明显已经做烂了好吧……
首先显而易见,翻转偶数次对结果没有影响,只需要考虑奇数次翻转的情况。
由于是整体移动的操作,可以抓住一个点来移动,然后还原出原来的序列。
需要注意的是字符串是环形移动,因此如果当前点的位置大于字符串长度,要对字符串的长度进行取余操作。
写的时候注意细节。
代码
#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;
}
标签:p2,洛谷,string,int,题解,len,P10058,取余,op
From: https://www.cnblogs.com/veryeasy/p/17967401