题目P10058[https://www.luogu.com.cn/problem/P10058]
这道题要求对字符串进行指定的操作:循环移动和翻转
因为要输出操作后的字符串,所以我们不妨在原字符串的基础上进行操作
考虑循环移动:
因为只需要输出最后一次,所以不难想到我们可以记录最后输出的字符串的第一位在哪里,那么我们就可以定义一个x来储存当前位置,定义一个a储存移位个数
例如题目要求>2,此时
x+=a
如果是<12,那么要先取余再加
x+=a%s.size()
如果是>12,那么要注意x可能会变为负数,所以要
x-=a%s.size()
x+=s.size()
当然x可能会超过字符串长度,所以要在每次移动后加上
x%=s.size()
所以每次循环移动操作应该是这样的
点击查看代码
string ss;
int a;
cin>>ss;
if(ss=="<")
{
cin>>a;
x+=a%s.size();
x%=s.size();
}
if(ss==">")
{
cin>>a;
x-=a%s.size();
x+=s.size();
x%=s.size();
}
考虑翻转:
这个只需要用一个c记录反向次数,当c==1时带表翻转奇数次,此时应该用reverse翻转一下,最后输出即可。
AC代码
点击查看代码
#include<bits/stdc++.h>
using namespace std;
string s;
int n,x,c;
int main()
{
cin>>s>>n;
for(int i=1;i<=n;i++)
{
string ss;
int a;
cin>>ss;
if(ss=="<")
{
cin>>a;
x+=a%s.size();
x%=s.size();
}
if(ss==">")
{
cin>>a;
x-=a%s.size();
x+=s.size();
x%=s.size();
}
if(ss=="rev")
{
x=s.size()-x;
c=(c==1?0:1);
}
}
if(c)
reverse(s.begin(),s.end());
for(int i=x;i<s.size();i++)
cout<<s[i];
for(int i=0;i<x;i++)
cout<<s[i];
return 0;
}