P10058

· · 题解

代码比较好写,但是思考起来比较难

首先看出在两次翻转之间的左移和右移是可以互相抵消一部分的,之后就是比较难想到的一部分。

把翻转变成改变头和尾

规律

可以看到先翻转还是先移动结果一样,只是移动方向需要改变。具体为每遇到一个翻转就把原先累积的移动方向和头尾改变一下,最后再统一移动。

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;
}

个人码风不好,见谅。