P10058 Reverse and Rotate 题解
题意简述
- 给定一个字符串
S 和n 次操作,每次操作为以下3 种形式之一:
-
< x表示将S 向左循环移动x 位。 -
> x表示将S 向右循环移动x 位。 -
rev表示将S 翻转。
- 求
S 在依次执行这n 次操作后得到的字符串S' 。
解题思路
假设只有前两种操作,如果每输入一次操作就执行一次,显然太过耗时;考虑记录下每一个操作的移动位数,输入结束后再统一操作即可。
但本题难点就在于处理第三种操作:rev。其实,手摸一下样例不难发现,一样也可以记录下字符串被反转的次数。对于被反转过奇数次的字符串,接下来的左移
代码实现
赛时代码
#include<bits/stdc++.h>
#define int long long
using namespace std;
string s,op;
int n,x,sum;
signed main(){
cin>>s>>n;
int f=1;
int len=s.size();
while(n--)
{
cin>>op;
if(op=="<"){
cin>>x;
if(f==1) sum-=x;
else sum+=x;
}
if(op==">"){
cin>>x;
if(f==1) sum+=x;
else sum-=x;
}
if(op=="rev"){
f=1-f;
}
}
sum%=len;
if(sum<0) sum=abs(sum),rotate(s.begin(),s.begin()+sum,s.end());
else rotate(s.rbegin(),s.rbegin()+sum,s.rend());
if(f==0) reverse(s.begin(),s.end());
cout<<s;
return 0;
}