zoukankan      html  css  js  c++  java
  • Bzoj1014 外星人Prefix

    题目传送门

    和上一篇题目几乎一样,不过还是这道题良心!bzoj好!poj慢到出*

    splay大法好! 两次AC不卡常!

    #pragma GCC opitmize("O3")
    #pragma G++ opitmize("O3")
    #include<stdio.h>
    #include<string.h>
    #include<algorithm>
    #define N 400010
    #define LL long long
    #define son(x) (x==ch[f[x]][1]) 
    using namespace std;
    LL h[N],bas[N]={1};
    int f[N],ch[N][2],sz[N],v[N];
    int n,m,cnt=0,rt=0,q;
    inline int newnode(int k){
        ++cnt; h[cnt]=v[cnt]=k; sz[cnt]=1;
        return cnt;
    }
    inline void ps(int x){ 
        sz[x]=sz[ch[x][0]]+sz[ch[x][1]]+1;
        h[x]=(h[ch[x][0]]*131+v[x])*bas[sz[ch[x][1]]]+h[ch[x][1]];
    }
    inline void rot(int x){
        int p=f[x],g=f[p],d=son(x);
        ch[p][d]=ch[x][!d]; f[ch[p][d]]=p;
        ch[x][!d]=p; f[p]=x; f[x]=g;
        if(g) ch[g][p==ch[g][1]]=x; ps(p); ps(x);
    }
    inline void splay(int x,int r=0){
        for(int p;(p=f[x])!=r;rot(x))
            if(f[p]!=r && son(x)==son(p)) rot(p);
        if(!r) rt=x;
    }
    inline int select(int k,int x=rt){
        for(int w;;){
            w=sz[ch[x][0]]+1;
            if(w==k) return x;
            if(k<w) x=ch[x][0];
            else k-=w,x=ch[x][1];
        }
    }
    inline int gRank(int k,int x=rt){
        int r=1;
        for(;x;){
            if(v[x]>=k) x=ch[x][0];
            else{ r+=sz[ch[x][0]]+1; x=ch[x][1]; }
        }
        return r;
    }
    inline int rank(int x){
        int r=sz[ch[x][0]]+1;
        for(;x;x=f[x])
            if(son(x)) r+=sz[ch[f[x]][0]]+1;
        return r;
    }
    inline void Llink(int x,int v){ f[ch[x][0]=v]=x; ps(x); }
    inline void Rlink(int x,int v){ f[ch[x][1]=v]=x; ps(x); }
    inline LL gH(int x,int len){
        splay(select(x-1));
        splay(select(x+len),rt);
        return h[ch[ch[rt][1]][0]];
    }
    char c[100010],o[3];
    int main(){
        scanf("%s%d",c,&n); m=strlen(c); rt=newnode(0);
        for(int i=1;i<100010;++i) bas[i]=bas[i-1]*131;
        for(int i=0;i<m;++i){ Llink(newnode(c[i]),rt); rt=cnt; }
        Llink(newnode(0),rt); rt=cnt;
        for(int x,y;n--;){
            scanf("%s",o);
            if(*o=='I'){
                scanf("%d%s",&x,o);
                splay(select(x+2)); 
                splay(select(x+1),rt);
                Rlink(ch[rt][0],newnode(*o));ps(rt);
            } else if(*o=='R'){ 
                scanf("%d%s",&x,o);
                splay(select(x+1)); 
                v[rt]=*o; ps(rt);
            } else {
                scanf("%d%d",&x,&y); 
                ++x; ++y;
                int a=x,b=y;
                if(x==y){printf("%d
    ",sz[rt]-max(a,b));continue;}
                int l=0,r=sz[rt]-max(a,b);
                for(int M;l<r;){
                    M=l+r+1>>1;
                    if(gH(a,M)==gH(b,M)) l=M;
                    else r=M-1;
                }
                printf("%d
    ",l);
            }
        }

  • 相关阅读:
    nullnullConnecting with WiFi Direct 与WiFi直接连接
    nullnullUsing WiFi Direct for Service Discovery 直接使用WiFi服务发现
    nullnullSetting Up the Loader 设置装载机
    nullnullDefining and Launching the Query 定义和启动查询
    nullnullHandling the Results 处理结果
    装置输出喷泉装置(贪心问题)
    数据状态什么是事务?
    停止方法iOS CGD 任务开始与结束
    盘文件云存储——金山快盘
    函数标识符解决jQuery与其他库冲突的方法
  • 原文地址:https://www.cnblogs.com/Extended-Ash/p/9477182.html
Copyright © 2011-2022 走看看