zoukankan      html  css  js  c++  java
  • 不知来源的题目——复制黏贴

    题意:
      就是一个字符串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 <bits/stdc++.h>
    using namespace std;
    const int SIZE = 2 * 1e5 + 10;
    int L, m, n, a[SIZE], b[SIZE], c[SIZE];
    char s[SIZE];
    int main() {
        cin >> L >> m;
        scanf("%s", (s + 1));
        cin >> n;
        for (int i = 1; i <= n; i++) cin >> a[i] >> b[i] >> c[i];
        for (int i = 1; i <= k; i++) {
            int P = i;
            for (int j = n; j >= 1; j--) {
                if (P <= c[j]) {
                    P = P;
                } else if (c[j] < ans && ans <= c[j] + b[j] - a[j]) {
                    P += a[j] - c[j];
                } else {
                    ans -= (b[j] - a[j]);
                }
            }
            cout << s[P];
        }
        puts("");
    }
  • 相关阅读:
    Django的认证系统
    Django 中间件
    Django Form和ModelForm组件
    AJAX
    Django中ORM介绍和字段及字段参数
    Django ORM那些相关操作
    Python中应该使用%还是format来格式化字符串?
    Cookie、Session和自定义分页
    ORM版学员管理系统3
    ORM版学员管理系统2
  • 原文地址:https://www.cnblogs.com/zcr-blog/p/11469313.html
Copyright © 2011-2022 走看看