题意
给一个字符串,每次把头几个字母挪到尾部,或者把尾部几个字母挪到头部。随时会问现在这个字符串的第几个字符是什么。
思路
仔细观察,发现无论怎样移动,字符串的相对顺序没有发生改变。也就是说,这是一个循环队列,一个转轮,在一直转,只是那个指向队头的位置在变而已。
所以采用游标管理。
最后注意数据吞吐量大,不要用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; }