【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;
}
posted @ 2020-08-09 20:44  Jayun  阅读(127)  评论(0编辑  收藏  举报