1 条题解
-
0
自动搬运
来自洛谷,原作者为

panxz2009
2027 高考加油搬运于
2025-08-24 22:54:16,当前版本为作者最后更新于2024-01-14 21:30:23,作者可能在搬运后再次修改,您可在原文处查看最新版自动搬运只会搬运当前题目点赞数最高的题解,您可前往洛谷题解查看更多
以下是正文
题意简述
- 给定一个字符串 和 次操作,每次操作为以下 种形式之一:
-
< x表示将 向左循环移动 位。 -
> x表示将 向右循环移动 位。 -
rev表示将 翻转。
- 求 在依次执行这 次操作后得到的字符串 。
解题思路
假设只有前两种操作,如果每输入一次操作就执行一次,显然太过耗时;考虑记录下每一个操作的移动位数,输入结束后再统一操作即可。
但本题难点就在于处理第三种操作:
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; }
- 1
信息
- ID
- 8278
- 时间
- 1000ms
- 内存
- 512MiB
- 难度
- 3
- 标签
- 递交数
- 0
- 已通过
- 0
- 上传者