zoukankan      html  css  js  c++  java
  • NOI2003 文本编辑器

    练手QAQ

    #include<iostream>
    #include<algorithm>
    #include<cstdio>
    #include<cstdlib>
    #include<cstring>
    #include<string>
    
    using namespace std;
    
    void setIO(const string& a) {
        freopen((a+".in").c_str(), "r", stdin);
        freopen((a+".out").c_str(), "w", stdout);
    }
    
    struct Node* null;
    
    const int N = 1024 * 1024 * 2+ 10; 
    
    struct Node {
        char v;
        int sz;
        Node* ch[2];
        
        Node(char v = 0) : v(v) {
            ch[0] = ch[1] = null;
            sz = 1;
        }
        
        void maintain() {
            sz = ch[0]->sz + ch[1]->sz + 1;
        }
        
        int cmp(int k) const {
            int s = ch[0]->sz + 1;
            if(k == s) return -1;
            return k < s ? 0 : 1;
        }
    }pool[N], *pis = pool, *root;
    
    void init() {
        null = new(pis++) Node(0);
        null->sz = 0;
        null->ch[0] = null->ch[1] = null;
        root = new(pis++) Node(-1);
        root->ch[1] = new(pis++) Node(-1);
    }
    
    void rotate(Node*& o, int d) {
        Node* t = o->ch[d];
        o->ch[d] = t->ch[d^1];
        t->ch[d^1] = o;
        o->maintain();
        (o = t)->maintain();
    }
    
    void splay(Node*& o, int k) {
        int d = o->cmp(k);
        if(d == -1) return;
        if(d == 1) k -= o->ch[0]->sz + 1;
        Node*& c = o->ch[d];
        int d2 = c->cmp(k);
        if(d2 != -1) {
            if(d2 == 1) k -= c->ch[0]->sz + 1;
            splay(c->ch[d2], k);
            if(d == d2) rotate(o, d);
            else rotate(c, d2);
        }
        rotate(o, d);
    }
    
    void split(Node*o, int k, Node*& l, Node*& r) {
        splay(o, k);
        l = o;
        r = o->ch[1];
        o->ch[1] = null;
        o->maintain();
    }
    
    Node* merge(Node* l, Node* r) {
        splay(l, l->sz);
        l->ch[1] = r;
        l->maintain();
        return l;
    }
    
    void print(Node* o) {
        if(o == null) return;
        print(o->ch[0]);
        if(0 < o->v) putchar(o->v);
        print(o->ch[1]);
    }
    
    Node* newtree(const char s[], int l, int r) {
        if(l > r) return null;
        int mid = (l + r) >> 1;
        Node* o = new(pis++) Node();
        o->ch[0] = newtree(s, l, mid - 1);
        o->v = s[mid];
        o->ch[1] = newtree(s, mid + 1, r);
        o->maintain();
        return o;
    }
    
    char text[N];
    
    void insert(int pos, Node* o) {
        Node *lft, *rgt;
        split(root, pos, lft, rgt);
        root = merge(lft, merge(o, rgt));
    }
    
    int main() {
    #ifdef DEBUG
        freopen("in.txt", "r", stdin);
    //    freopen("out.txt", "w", stdout);
    #endif
        
        int m;
        scanf("%d", &m);
        init();
        
        char opt[10], c;
        int pos = 1, n, sz = 0;
        Node *o, *lft, *rgt, *mid;
        
        while(m--) {
            scanf("%s", opt);
            if(strcmp(opt, "Move") == 0) {
                scanf("%d", &pos); ++pos; 
            }else if(strcmp(opt, "Insert") == 0) {
                int n;
                scanf("%d", &n);
                for(int i = 0; i < n; i++) {
                    c = getchar();
                    while(c == '
    ') c = getchar();
                    text[i] = c;
                }
                sz += n;
                insert(pos, newtree(text, 0, n - 1));
            }else if(strcmp(opt, "Delete") == 0) {
                scanf("%d", &n);
                n = min(sz - pos + 1, n);
                split(root, pos, lft, o);
                split(o, n, mid, rgt);
                sz -= mid->sz;
                root = merge(lft, rgt);
            }else if(strcmp(opt, "Prev") == 0) {if(pos > 1) pos--;}
            else if(strcmp(opt, "Next") == 0) {if(pos <= sz) pos++;}
            else {
                scanf("%d", &n);
                split(root, pos, lft, o);
                n = min(sz - pos + 1, n);
                split(o, n, mid, rgt);
                print(mid); puts("");
                root = merge(merge(lft, mid), rgt);
            }
        }
        
        return 0;
    }
    View Code

    有空了去写块链?

  • 相关阅读:
    Linux文件属性
    [Oracle] Listener的动态注册
    jQuery easyUI Pagination控件自定义div分页(不用datagrid)
    桂林电子科技大学出校流量控制器Android版1.0.0
    php使用check box
    Python windows ping
    Python selenium chrome 环境配置
    Linux wget auto login and backup database
    PyQt4 ShowHMDB show sqlite3 with QTableWidget summary
    PyQt4 py2exe 打包 HardwareManager
  • 原文地址:https://www.cnblogs.com/showson/p/4981722.html
Copyright © 2011-2022 走看看