【题意】给你一个字符串,s,t,p指将第s到t个字符复制,粘贴到第p位上。经过n次操作,输出前k个字符。
【思路】因为m=10^9,直接做会爆。每一个字符都是由上一个字符串转移来的,因此我们每次记录当前字符在上一个字符串中的位置,逐层递推回去,便得到其在初始字符串中的位置。
【代码】
#include <iostream>
#include <cstdlib>
#include <cstdio>
#include <cstring>
#include <cmath>
using namespace std;
const int maxn=200005;
int n,m,k,s[maxn],p[maxn],t[maxn];
char str[maxn];
inline int get(){
char c;while(!isdigit(c=getchar()));
int v=c-48;while(isdigit(c=getchar()))v=v*10+c-48;
return v;
}
int main(){
k=get();m=get();
cin>>str;n=get();
for(int i=1;i<=n;++i)s[i]=get(),t[i]=get()-1,p[i]=get();
for(int i=0;i<k;++i){
int x=i;
for(int j=n;j>=1;--j){ //当前字符位于粘贴字符之前,不用处理
if(x>=p[j] && x<=p[j]+t[j]-s[j])x-=p[j]-s[j]; //当前字符位于粘贴字符中
else if(x>p[j]+t[j]-s[j])x-=t[j]-s[j]+1; //当前字符位于粘贴字符之后
}
printf("%c",str[x]);
}
printf("\n");
return 0;
}