我又来更新题解了
虽然这次还是拖了
题意大概是这样的,给定一个字符串,有修改和输出答案两种操作。给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;
}