2020牛客暑期多校训练营(第三场)B.Classical String Problem

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+x1(因为实际字符串的索引是从 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;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值