题意
给一个字符串,每次把头几个字母挪到尾部,或者把尾部几个字母挪到头部。随时会问现在这个字符串的第几个字符是什么。
思路
仔细观察,发现无论怎样移动,字符串的相对顺序没有发生改变。也就是说,这是一个循环队列,一个转轮,在一直转,只是那个指向队头的位置在变而已。
所以采用游标管理。
最后注意数据吞吐量大,不要用cin、cout。以及格式需要getchar。
code
#include <bits/stdc++.h>
#define sc(x) scanf("%d", &(x))
using namespace std;
typedef long long ll;
const int N = 2e6 + 7;
char s[N];
int main() {
scanf("%s", s);
int T, x, len = strlen(s), base = 0;
sc(T);
char op;
while (T--) {
getchar();
scanf("%c%d", &op, &x);
if (op == 'M')
base = (base + len + x) % len;
else
putchar(s[(x + base + len - 1) % len]), putchar('\n');
}
return 0;
} 比赛的时候写得冗余一点:
#include <bits/stdc++.h>
#define sc(x) scanf("%d", &(x))
using namespace std;
typedef long long ll;
const int N = 2e6 + 7;
char s[N];
int main() {
scanf("%s", s);
int T, x, len = strlen(s), base = 0;
sc(T);
char op;
while (T--) {
getchar();
scanf("%c%d", &op, &x);
if (op == 'M') {
if (x > 0) {
base += x;
} else {
base += len;
base += x;
base %= len;
}
} else {
int ans = x + base + len - 1;
ans %= len;
putchar(s[ans]);
putchar('\n');
}
}
return 0;
} 
京公网安备 11010502036488号