B.Classical String Problem
题目链接-B.Classical String Problem
题目大意
给你一个字符串
s
s
s,有
q
q
q次操作,输入
M
M
M
x
x
x,表示将字符串最左边的
x
x
x个字符移动到字符串最右边,
M
M
M
−
x
-x
−x,表示将字符串最右边的
x
x
x个字符移动到最左边。
A
A
A
x
x
x,表示询问当前字符串第
x
x
x个位置的字符
解题思路
- 设置一个头指针 h e a d = 0 head=0 head=0,记录每次变化后的第一个字符即可
- 当 x < 0 x<0 x<0时,要把最右边的 x x x个字符移动到最左边,那么移动后头指针 h e a d head head对应的就是 h e a d + l + x head+l+x head+l+x,当 x > 0 x>0 x>0时,要把字符串最左边的 x x x个字符移动到字符串最右边,那么移动后头指针 h e a d head head对应的就是 h e a d + x head+x head+x。综上所述,每次移动后头指针对应的就是 ( h e a d + x ) (head+x) (head+x)% l l l
- 当我们查询第 x x x个位置的字符时,直接将 h e a d + x − 1 head+x-1 head+x−1(因为实际字符串的索引是从 0 0 0开始的,所以要减 1 1 1)对字符串长度取模即可
- 具体操作见代码
附上代码
#pragma GCC optimize("-Ofast","-funroll-all-loops")
#include<bits/stdc++.h>
#define int long long
#define lowbit(x) (x &(-x))
#define endl '\n'
using namespace std;
const int INF=0x3f3f3f3f;
const int dir[4][2]={-1,0,1,0,0,-1,0,1};
const double PI=acos(-1.0);
const double e=exp(1.0);
const double eps=1e-10;
const int M=1e9+7;
const int N=2e5+10;
typedef long long ll;
typedef pair<int,int> PII;
typedef unsigned long long ull;
string s;
signed main(){
ios::sync_with_stdio(false);
cin.tie(0);cout.tie(0);
int q,x,head=0;
cin>>s>>q;
int l=s.length();
while(q--){
char c;
cin>>c>>x;
if(c=='A')
cout<<s[(head+l+x-1)%l]<<endl;
else
head=(head+x)%l;
}
return 0;
}