私は、件名(コピーペースト)のソースを知りません

题意:
  就是一个字符串s(只包含小写字母),现在可以复制黏贴从位置i到位置j的所有字符(位置x为第x个字符与第x+1个字符中间的空隙)放到位置k。
  复制黏贴的总长度不超过m,求n次复制黏贴后前L个字符分别是什么。

数据范围:
  L <= 200; m <= 10^9; n <= 10^5; |s| <= 10^5;
样例输入:
6 100
jjooii
3
5 6 2
4 6 1
1 2 3
我们发现如果暴力去模拟的话肯定会TLE(m <= 10^9),所以肯定不能暴力。我们再看要求输出的内容:前L(L <= 200)个字符,很舒服,所以应该就是从这里入手。
首先我们想对于每一个i(1 <= i <= L),我们开始分类讨论:
现在的位置记为P,刚开始P = i;
从第n条指令到第1条:
j从n到1。
1,若P <= c[j] P肯定不会改变(在前面不会受到影响)
2,若c[j] < p && p <= c[j] + b[j] - a[j], 则P += a[j] - c[j](P属于被复制的部分)
3,若P > c[j] + b[j] - a[j] 则p -= b[j] - a[j](P属于往后挪的部分)
上代码:
#include <ビット/ STDC ++ H>
 使用して 名前空間STDを、
const  int型 SIZE = 2 * 1E5 + 10 int型のL、M、N、[SIZE]、B [SIZE]、C [SIZE]。
チャーS [SIZE]。
INT メイン(){ 
    CIN >> L >> M。
    scanf関数(" %sの"、(S + 1 ))。
    cinを >> N;
    以下のためにint型 i = 1 ; iが= <N; iは++)CIN >> [I] >> B [i]は>> C [i]は、
    以下のためにint型私= 1 ; iが= Kを<; I ++){
         int型 P = I。
        int型 J = N; J> = 1 ; j-- ){
             場合(P <= {C [J])
                P = P。
            } そう なら(C [J] <ANS && ANS <= C [J] + B [J] - [J]){ 
                P + = [J] - C [J]。
            } { 
                ANS - =(B [J] - [J])。
            } 
        } 
        COUT << S [P]。
    } 
    プット("" )。
}

おすすめ

転載: www.cnblogs.com/zcr-blog/p/11469313.html