2020牛客暑期多校第三场B-Classical String Problem(字符串移动思维)

题目大意:给你一个字符串,有q次操作,每次三种类型M x,表示将字符串最左边的x个字符移动到字符串最右边,M -x,表示将字符串最右边的x个字符移动到最左边。A x,表示询问当下字符串第x个位置的字符是什么(字符串位置从1开始)

输入

nowcoder
6
A 1
M 4
A 6
M -3
M 1
A 1

输出

n
o
w

刚开始的时候确实给我看蒙了。。。我还以为是什么数据结构呢。。。但随着AC人数的增加我发现事情似乎并不简单。。。

我们设置head指针,当字符串将最左边的x个移动到最右边的时候,我们只需要将head移动到x+1位置即可,将最右边的x各移动到最左边,实际上就是将最左边的n-x个字符移动到最右边,那么我们将head移动到当前head位置再+n-x+1即可,最后询问的时候我们直接将head+x对字符串长度取模即可

以下是AC代码:

#include <bits/stdc++.h>
using namespace std;
 
int main(int argc, char const *argv[])
{
    ios::sync_with_stdio(false);
    cin.tie(0);cout.tie(0);
    string s;
    int q;
    cin>>s;
    cin>>q;
    int len=s.length();
    long long head=0,tail=len-1;
    while (q--){
        char op[5];
        int x;
        cin>>op>>x;
        if (op[0]=='A'){
            x--;
            cout<<s[(head+x)%len]<<'
';
        }
        else {
            if (x>0) head+=x;
            else head+=len+x;
        }
    }
    return 0;
}
路漫漫兮
原文地址:https://www.cnblogs.com/lonely-wind-/p/13352589.html