题目大意:
给定一个字符串,进行几个操作:将字符串中的 (a) 至 (b) 的字符复制到其 (c) 的位置。求出最终字符串长度为 (k) 的前缀。
正文:
思路:
可以定义 (k) 个指针指向字符串的前 (k) 位。但是直接暴力肯定时超,所以我们可以通过移动指针位置来确定最终字符串。
举例:
拿样例举例。
2 18
copypaste
4
3 6 8
1 5 2
4 12 1
17 18 0
前 (k) 个指针分别指向 (1,2)。
第一步操作,前 (k) 个指针分别指向 (1,2)。
可以发现 (c) 在某指针之后的话,指针无需操作。
第三步操作,前 (k) 个指针分别指向 (1,4)。
第四步操作,前 (k) 个指针分别指向 (6,1)。
可以发现如果指针小于 (c+b-a),那么指针就要指向自己减去 (c-a) 的值,否则指向自己减去 (b-a) 的值。
代码:
int main()
{
scanf("%d%d", &k, &m);
scanf ("%s", str);
scanf ("%d", &n);
for (int i = 1; i <= n; i++)
scanf("%d%d%d", &a[i], &b[i], &c[i]);
for (int i = 1; i <= k; i++) pos[i] = i;
for (int i = n; i >= 1; i--)
{
for (int j = 1; j <= k; j++)
{
if(pos[j] <= c[i]) continue;
if(pos[j] <= c[i] + b[i] - a[i])
pos[j] -= c[i] - a[i];
else
pos[j] -= b[i] - a[i];
}
}
for (int i = 1; i <= k; i++) printf("%c", str[pos[i] - 1]);
return 0;
}