题意: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;
}