题目大意:给你一个字符串,有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; }