给出一个字符串 s s s,你需要执行 m m m 个任务。每个任务给出两个下标 l i , r i l_i,r_i li,ri 和一个整数 k i k_i ki(字符串的下标从 1 1 1 开始),表示你需要循环挪动 s s s 的子串 s [ l i . . . r i ] k i s[l_i...r_i]\ k_i s[li...ri] ki 次。请从前到后依次执行给出的每个任务。
字符串的循环挪动操作:将最后一个字符移到第一个字符的位置,并且将其他所有字符向右移一个位置。
比如:如果字符串 s s s 是 abacaba
,一个任务为 l 1 = 3 , r 1 = 6 , k 1 = 1 l_1=3,r_1=6,k_1=1 l1=3,r1=6,k1=1,那么答案为 abbacaa
。接下来一个任务为 l 2 = 1 , r 2 = 4 , k 2 = 2 l_2=1,r_2=4,k_2=2 l2=1,r2=4,k2=2,那么我们会得到 baabcaa
。
第一行一个字符串 s s s,该字符串只包含小写英文字符。
第二行一个整数 m m m,表示任务个数。
接下来 m m m 行每行有三个整数 l i , r i l_i,r_i li,ri 和 k i k_i ki。
输出执行了 m m m 个任务后的最终的字符串 s s s。
abacaba
2
3 6 1
1 4 2
baabcaa
对于所有数据保证, 1 ≤ ∣ s ∣ ≤ 10000 1≤|s|≤10000 1≤∣s∣≤10000( ∣ s ∣ |s| ∣s∣ 表示字符串 s s s 的长度), 1 ≤ m ≤ 300 1≤m≤300 1≤m≤300, 1 ≤ l i ≤ r i ≤ ∣ s ∣ 1≤l_i≤r_i≤|s| 1≤li≤ri≤∣s∣, 1 ≤ k i ≤ 1000000 1≤k_i≤1000000 1≤ki≤1000000。
步骤如下:
(1)对 k = k % l e n k=k\%len k=k%len(因为循环移动 l e n = r − l + 1 len = r - l + 1 len=r−l+1次之后,子串与操作前一致)
(2)取出子串尾部 k k k个字符缓存
(3)将前 l e n − k len - k len−k个字符向后移动 k k k位
(3)将缓存的字符放回子串首部
( p s ps ps:本来想先用模拟尝试深入理解一下题目,看一眼数据规模发现好像能过,结果就过了 q w q qwq qwq)
AC代码如下
#include
using namespace std;
const int max_len = 1e4;
char str[max_len + 1];
char buffer[max_len + 1];
int main() {
char c = '\0';
int len = 0;
while ((c = getchar()) != '\n' && c != '\r') {
str[len++] = c;
}
str[len] = '\0';
int t, l, r, k;
cin >> t;
for (int i = 0; i < t; i++) {
cin >> l >> r >> k;
k %= r - l + 1; l--; r--;
for (int j = r - k + 1; j <= r; j++) {
buffer[j] = str[j];
}
for (int j = r - k; j >= l; j--) {
str[j + k] = str[j];
}
for (int j = r - k + 1, idx = l; j <= r; j++, idx++) {
str[idx] = buffer[j];
}
}
cout << str << endl;
return 0;
}