题意:s字符串小写字母组成,执行q个操作,有两个类型的操作。
(1)M-修改:如果x为正,字符串最左边的x个移到字符串的右边。如果x为负,字符串最右边的|x|个移到字符串左边。
(2)A-回答:回到当前字符串第x个字符是什么。
思路:
(1)标程思路:通过画图我们能够得出,我们设定一个指针,刚开始让它指0,因为字符串是从0开始的,所以x为正,指针向右移动x的长度,指针增加x,但注意一下字符串的长度问题,所以我们要及时取余,x为负数时,就是指针往左移动x,就是指针减少x,因为可能涉及到负数的问题不太好操作,所以就是把它换成正数就是n+x,因为x为负,也要及时取余,输出时如果是指针+要查询的x正好到最后一位的话,就输出最后一位,剩余的输出(ans+x)%t-1位。
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
int main ()
{
string s;
cin>>s;
int t=s.size();
int q1;
scanf("%d",&q1);
getchar();
ll ans=0;
while(q1--){
char ch;
int x;
scanf("%c %d",&ch,&x);
getchar();
if(ch=='M'){
if(x<0) x=t+x;
ans+=x;
ans=ans%t;
}
else if(ch=='A')
{
if(ans+x==t) printf("%c\n",s[t-1]);
else printf("%c\n",s[(ans+x)%t-1]);
}
}
return 0;
}
/*队友把cin改scanf后ac了,有点魔性。
(2)我的思路:我通过画图,能发现出目前第一位是什么字母与x,t的关系,同样通过移动,取余等等操作,也能得出答案,就不详细讲了。
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
int main ()
{
ios::sync_with_stdio(false);
string s;cin>>s;
int t=s.size();
int q1;cin>>q1;
ll ans=0;
while(q1--){
char ch;
int x;
cin>>ch>>x;
if(ch=='M'){
if(x<0){
x=-x;
ans=(ans+x)%t;
}
else if(x>0){
if(ans-x<0){
ans=t+(ans-x);
}
else{
ans=ans-x;
}
}
}
else if(ch=='A')
{
cout<<s[((t-ans)%t+x-1)%t]<<endl;
}
}
return 0;
}