1 条题解

  • 0
    @ 2025-8-24 22:54:16

    自动搬运

    查看原文

    来自洛谷,原作者为

    avatar panxz2009
    2027 高考加油

    搬运于2025-08-24 22:54:16,当前版本为作者最后更新于2024-01-14 21:30:23,作者可能在搬运后再次修改,您可在原文处查看最新版

    自动搬运只会搬运当前题目点赞数最高的题解,您可前往洛谷题解查看更多

    以下是正文


    题意简述

    • 给定一个字符串 SSnn 次操作,每次操作为以下 33 种形式之一:
    1. < x 表示将 SS 向左循环移动 xx 位。

    2. > x 表示将 SS 向右循环移动 xx 位。

    3. rev 表示将 SS 翻转。

    • SS依次执行这 nn 次操作后得到的字符串 SS'

    解题思路

    假设只有前两种操作,如果每输入一次操作就执行一次,显然太过耗时;考虑记录下每一个操作的移动位数,输入结束后再统一操作即可。

    但本题难点就在于处理第三种操作:rev。其实,手摸一下样例不难发现,一样也可以记录下字符串被反转的次数。对于被反转过奇数次的字符串,接下来的左移 xx 位操作就转化为右移 xx 位操作,同理,右移 xx 位操作就转化为左移 xx 位操作。若字符串被反转了偶数次,则左移、右移操作照常。

    代码实现

    赛时代码

    #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
    上传者