10pts,MLE玄关
查看原帖
10pts,MLE玄关
934350
Eason20120229楼主2025/1/30 23:06

玄关

#include <bits/stdc++.h>
#define ull unsigned long long

using namespace std;

using it = list< vector< char > >::iterator;

ull blen = 2000;

int t;
list< vector< char > > l;
vector< char > str;

auto find(ull &pos) -> it {
    it x = l.begin();
    while (x != l.end() && x->size() < pos) {
        pos -= x->size();
        x++;
    }
    return x;
}

auto nxt(it x) -> it {
    return ++x;
}

void split(it x, ull pos) {
    if (pos == x->size()) {
        return;
    }
    l.insert(nxt(x),
             vector< char >(x->begin() + pos, x->end()));
    x->erase(x->begin() + pos, x->end());
}

void merge(it x) {
    x->insert(x->end(), nxt(x)->begin(), nxt(x)->end());
    l.erase(nxt(x));
}

void upd() {
    for (it x = l.begin(); x != l.end(); x++) {
        while (x->size() > blen * 2) {
            split(x, blen);
        }
        while (nxt(x) != l.end() &&
               x->size() + nxt(x)->size() < blen) {
            merge(x);
        }
        while (nxt(x) != l.end() && nxt(x)->empty()) {
            l.erase(nxt(x));
        }
    }
}

void out() {
    for (it x = l.begin(); x != l.end(); x++) {
        for (char i : *x) {
            cout << i;
        }
    }
}

void ins(ull pos, const vector< char > &str) {
    it x = find(pos);
    if (!l.empty()) {
        split(x, pos);
    }
    l.insert(nxt(x), str);
    upd();
}

void del(ull left, ull right) {
    it xl = find(left);
    split(xl, left);
    it xr = find(right);
    split(xr, right);
    xr++;
    for (; nxt(xl) != xr;) {
        l.erase(nxt(xl));
    }
    upd();
}

void get(ull left, ull right) {
    it xl = find(left);
    it xr = find(right);
    for (it x = xl;; x++) {
        ull a = x == xl ? left : 0;
        ull b = x == xr ? right : x->size();
        for (ull i = a; i < b; i++) {
            putchar(x->at(i));
        }
        if (x == xr) {
            break;
        }
    }
    puts("");
}

char opt[11];
ull len, pos;

auto main() -> int {
    freopen("P4008_1.in", "r", stdin);
    freopen("1.ttt", "w", stdout);
    cin >> t;
    while (t-- != 0) {
        cin >> opt;
        if (opt[0] == 'M') {
            cin >> pos;
        }
        if (opt[0] == 'I') {
            cin >> len;
            str.resize(len);
            for (int i = 0; i < len; i++) {
                str[i] = static_cast< char >(getchar());
                while (str[i] < 32 || str[i] > 126) {
                    str[i] = static_cast< char >(getchar());
                }
            }
            ins(pos, str);
        }
        if (opt[0] == 'D') {
            cin >> len;
            del(pos, pos + len);
        }
        if (opt[0] == 'G') {
            cin >> len;
            get(pos, pos + len);
        }
        if (opt[0] == 'P') {
            pos--;
        }
        if (opt[0] == 'N') {
            pos++;
        }
        // cout << endl << pos << "out:";
        // out();
        // cout << endl;
    }
    return 0;
}

2025/1/30 23:06
加载中...