牛客暑期多校第三场 B.Classical String Problem

我又来更新题解了
虽然这次还是拖了

题目链接

题意大概是这样的,给定一个字符串,有修改和输出答案两种操作。给Q次询问,每次询问会给出一个字符ch和一个数x。
如果 ch == ‘M’ 这一项操作就是修改,修改的时候如果 x 是正数,就把字符串最左边的 x 个字符移到最右边,如果 x 是负数,就把字符串最右边的 x 个字符移到最左边。
如果 ch == ‘A’ 就输出当前字符串的第x个字符

我一开始就去模拟这个过程,由于Q的范围太大加上字符串本身的长度,直接模拟的复杂度太高根本就跑不过去
用样例来说,首先将左边的4个字符移到最右边,nowcoder就变成了odernowc,然后将右边的3个字符移到最左边,就变成了owcodern
我们在输出答案时,是以0作为起点去输出第 x 个字符,但是在纸上模拟这个过程的时候发现,无论哪种修改的操作都相当于是把这个字符串看做一个首字符和尾字符相连的一个环,每次去修改这个字符串的起点,就像这样

在这里插入图片描述
所以这样每次修改的操作就变成了 O(1) 去修改这个字符串的起点,输出答案的时候直接输出 s[l+x-1]即可

char s[maxn],ch;
int Q,x;

int main(){
	
	gets(s);
	int len = strlen(s);
	for(int i=len;i<2*len;i++){ // 将字符串扩大一倍 
		s[i] = s[i-len];
	}
	int n = strlen(s); // 扩大后的字符串长度
	
	scanf("%d",&Q);
	int l = 0, r = n/2;
	while(Q--){
		
		getchar();
		scanf("%c%d",&ch,&x);
		if(ch == 'M'){ // 修改操作 
			l += x;
			r += x;
			l = (l%n + n) % n;
			r = (r%n + n) % n;
		}else printf("%c\n",s[(l+x-1)%n]);
	}
	return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

你数过天上的星星吗

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值