本文章由 WyOJ Shojo 从洛谷专栏拉取,原发布时间为 2024-01-14 21:53:31
代码比较好写,但是思考起来比较难
首先看出在两次翻转之间的左移和右移是可以互相抵消一部分的,之后就是比较难想到的一部分。
把翻转变成改变头和尾

规律

可以看到先翻转还是先移动结果一样,只是移动方向需要改变。具体为每遇到一个翻转就把原先累积的移动方向和头尾改变一下,最后再统一移动。
CODE
#include<bits\/stdc++.h>
#define int long long
using namespace std;
inline long long read() {
long long s=0;
char ch=getchar();
while(ch<'0'||ch>'9') ch=getchar();
while(ch>='0'&&ch<='9') {
s=(s<<3)+(s<<1)+(ch^48);
ch=getchar();
}
return s;
}
inline void write(long long x) {
if(x<0) putchar('-'),x=-x;
if(x>9) write(x\/10);
putchar(x%10+'0');
}
char s[1000005];
int n,flag,pos,len;
deque<char>q;
void make(){
int u=abs(pos);
if(u>len\/2){
u=len-u;
if(pos>0) pos=-u;
else pos=u;
}
if(flag==0){
if(pos>0){
pos%=len;
while(pos){
q.push_back(q.front());
q.pop_front();
pos--;
}
}
else {
pos=-pos;
pos%=len;
while(pos){
q.push_front(q.back());
q.pop_back();
pos--;
}
}
}
else {
if(pos>0){
pos%=len;
while(pos){
q.push_front(q.back());
q.pop_back();
pos--;
}
}
else {
pos=-pos;
pos%=len;
while(pos){
q.push_back(q.front());
q.pop_front();
pos--;
}
}
}
}
void print(){
if(flag==0){
while(q.size()){
putchar(q.back());
q.pop_back();
}
}
else {
while(q.size()){
putchar(q.front());
q.pop_front();
}
}
}
signed main() {
scanf("%s",s);
len=strlen(s);
for(int i=0;i<len;i++){
q.push_front(s[i]);
}
n=read();
for(int i=1;i<=n;i++){
char ss[10];
int x;
scanf("%s",ss);
if(ss[0]=='>'){
x=read();
pos+=x;
}
else if(ss[0]=='<'){
x=read();
pos-=x;
}
else {
pos=-pos;
flag=!flag;
}
}
make();
print();
return 0;
}
个人码风不好,见谅。

鲁ICP备2025150228号