NC215149. 小西和复制粘贴
描述
输入描述
第一行输入两个整数和第二行为字符串第三行输入一个整数接下来行每行三个整数依次表示表示的长度。保证每次操作的参数对当前的合法。
输出描述
输出一行长度为的字符串表示操作完之后的前位的内容
示例1
输入:
2 18 abcdefghi 4 3 6 8 1 5 2 4 12 1 17 18 0
输出:
fa
示例2
输入:
6 100 abcdef 3 5 6 2 4 6 1 1 2 3
输出:
adedbf
C++(clang++11) 解法, 执行用时: 315ms, 内存消耗: 5252K, 提交时间: 2020-12-22 21:18:23
#include<bits/stdc++.h> #define ll long long using namespace std; ll n,k,m; char s[2000005]; ll x[200005]; ll sum[200006]; ll a[200005]; ll b[200005]; ll c[200005]; int main(){ cin >> k >> m; cin >> s; cin >> n; for(ll i = n-1;~i;i--){ cin >> a[i] >> b[i] >> c[i]; } for (ll i = 0;i < k;i++){ ll p = i; for (ll j = 0;j < n;j++) if(c[j]<=p){ ll tmp = b[j] - a[j]; if (c[j] + tmp > p)p = a[j] + p - c[j]; else p -= tmp; } cout << s[p]; } }
C(clang11) 解法, 执行用时: 198ms, 内存消耗: 2844K, 提交时间: 2020-12-22 22:43:53
#include<stdio.h> #define MAX 200006 int k,m,n,a[MAX],b[MAX],c[MAX]; char s[MAX]; int main(void) { scanf("%d%d",&k,&m); scanf("%s",s); scanf("%d",&n); for(int i=n-1; ~i; i--) { scanf("%d%d%d",&a[i],&b[i],&c[i]); } for(int i=0; i<k; i++) { int p=i;//找第p个字符 for(int j=0; j<n; j++) if(c[j]<=p) { int len=b[j]-a[j]; if(c[j]+len>p) p+=a[j]-c[j]; else p-=len; }//c[j]比p大,不影响;比p小,要么取代p,要么让p的位置往前 putchar(s[p]); } return 0; }