牛客暑假多校训练营(第三场)B-Classical String Problem-字符串

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
题意: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;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值