【JZOJ 4294】 复制&粘贴2

题目大意:

给定一个字符串,进行几个操作:将字符串中的 (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;
}
原文地址:https://www.cnblogs.com/GJY-JURUO/p/13466262.html