zoukankan      html  css  js  c++  java
  • [NOI2003]文本编辑器 [Fhq Treap]

    [NOI2003]文本编辑器

    没啥好说的 就是个板子

    #include <bits/stdc++.h>
    // #define int long long
    #define rep(a , b , c) for(int a = b ; a <= c ; ++ a)
    #define Rep(a , b , c) for(int a = b ; a >= c ; -- a)
    #define go(u) for(int i = G.head[u] , v = G.to[i] , w = G.dis[i] ; i ; v = G.to[i = G.nxt[i]] , w = G.dis[i])
    
    using namespace std ;
    using ll = long long ;
    using pii = pair < int , int > ;
    using vi = vector < int > ;
    
    int read() {
      int x = 0 ; bool f = 1 ; char c = getchar() ;
      while(c < 48 || c > 57) { if(c == '-') f = 0 ; c = getchar() ; }
      while(c > 47 && c < 58) { x = (x << 1) + (x << 3) + (c & 15) ; c = getchar() ; }
      return f ? x : -x ;
    }
    
    template <class T> void print(T x , char c = '
    ') {
      static char st[100] ; int stp = 0 ;
      if(! x) { putchar('0') ; }
      if(x < 0) { x = -x ; putchar('-') ; }
      while(x) { st[++ stp] = x % 10 ^ 48 ; x /= 10 ; }
      while(stp) { putchar(st[stp --]) ; } putchar(c) ;
    }
    
    template <class T> void cmax(T & x , T y) { x < y ? x = y : 0 ; }
    template <class T> void cmin(T & x , T y) { x > y ? x = y : 0 ; }
    
    const int _N = 1e6 + 10 ;
    struct Group {
      int head[_N] , nxt[_N << 1] , to[_N] , dis[_N] , cnt = 1 ;
      Group () { memset(head , 0 , sizeof(head)) ; }
      void add(int u , int v , int w = 1) { nxt[++ cnt] = head[u] ; to[cnt] = v ; dis[cnt] = w ; head[u] = cnt ; }
    } ;
    
    const int N = 1e7 + 10  ;
    typedef int arr[N] ;
    int GB ;
    int rt = 0 , cnt = 0 ;
    char val[N] ;
    int sz[N] , rnd[N] ;
    int ch[N][2] ;
    #define ls(x) ch[x][0]
    #define rs(x) ch[x][1]
    int NewNode(char c) {
    	val[++ cnt] = c ;
    	sz[cnt] = 1 ;
    	rnd[cnt] = rand() ;
    	return cnt ;
    }
    void pushup(int x) {
    	sz[x] = sz[ls(x)] + sz[rs(x)] + 1 ;
    }
    int merge(int x , int y) {
    	if(! x || ! y) return x | y ;
    	if(rnd[x] < rnd[y]) {
    		rs(x) = merge(rs(x) , y) ;
    		pushup(x) ;
    		return x ;
    	}
    	else {
    		ls(y) = merge(x , ls(y)) ;
    		pushup(y) ;
    		return y ;
    	}
    }
    void split(int cur , int k , int & x , int & y) {
    	if(! cur) {
    		x = y = 0 ;
    		return ;
    	}
    	if(sz[ls(cur)] < k) {
    		x = cur ;
    		split(rs(x) , k - sz[ls(x)] - 1 , rs(x) , y) ;
    		pushup(x) ;
    		return ;
    	}
    	else {
    		y = cur ;
    		split(ls(y) , k , x , ls(y)) ;
    		pushup(y) ;
    		return ;
    	}
    }
    void Move(int x) {
    	GB = x ;
    }
    void Insert(int len) {
    	int x , y ;
    	split(rt , GB , x , y) ;
    	int _cnt = 0 ; char c = getchar() ;
    	int Newroot = 0 ;
    	while(_cnt < len) {
    		if(c >= 32 && c <= 126 && c != '
    ') ++ _cnt , Newroot = merge(Newroot , NewNode(c)) ;
    		c = getchar() ;
    	}
    	rt = merge(x , merge(Newroot , y)) ;
    }
    void Delete(int len) {
    	int x , y , z ;
    	split(rt , GB , x , y) ;
    	split(y , len , y , z) ;
    	rt = merge(x , z) ;
    }
    void dfs(int o) {
    	if(ls(o)) dfs(ls(o)) ;
    	putchar(val[o]) ;
    	if(rs(o)) dfs(rs(o)) ;
    }
    void Get(int len) {
    	int x , y , z ;
    	split(rt , GB , x , y) ;
    	split(y , len , y , z) ;
    	dfs(y) ; putchar('
    ') ;
    	rt = merge(merge(x , y) , z) ;
    }
    void Prev() {
    	-- GB ;
    }
    void Next() {
    	++ GB ;
    }
    string s ;
    signed main() {
    	int q = read() ;
    	while(q --) {
    		cin >> s ;
    		if(s == "Move") Move(read()) ;
    		if(s == "Insert") Insert(read()) ;
    		if(s == "Delete") Delete(read()) ;
    		if(s == "Get") Get(read()) ;
    		if(s == "Prev") Prev() ;
    		if(s == "Next") Next() ;
    	}
    	return 0 ;
    }
    
  • 相关阅读:
    RSA 与 DSA
    atlassian
    Cygwin
    windows下编写的Shell脚本在Linux下运行错误的解决方法
    NSKeyValueObserving(KVO)
    UIBezierPath 的使用介绍
    Objective
    Objective-C 内存管理原则
    Mac OSX 快捷键&命令行总览
    浅析Objective-C字面量
  • 原文地址:https://www.cnblogs.com/Isaunoya/p/12019615.html
Copyright © 2011-2022 走看看