• BZOJ3448 : [Usaco2014 Feb]Auto-complete


    RE了几十发,实在没办法了…只好向管理员要数据,然后发现数据规模与题目描述不符…

    建立Trie并求出DFS序,同时根据DFS序确定字典序

    然后每次询问相当于询问子树第k小,用主席树维护,注意压缩内存

    时间复杂度$O(L+nlog w)$,L为所有串长度之和

    #include<cstdio>
    #include<cstring>
    const int N=100010,T=2100000,M=2000010;
    int n,q,i,k,v[T],st[T],en[T],tot,dfn,now,root[T],l[M],r[M],cnt,val[M],a[N],b[N],seq[T];
    int g[T],nxt[T],to[T],ed;
    char s[T],ch[T],w[T];
    inline void addedge(int x,int y,int z){to[++ed]=y,w[ed]=z;nxt[ed]=g[x];g[x]=ed;}
    inline int son(int x,int y){
      for(int i=g[x];i;i=nxt[i])if(w[i]==y)return to[i];
      return 0;
    }
    inline void ins(int p){
      for(int x=0,i=0,j=std::strlen(s),w;i<j;i++){
        if(!son(x,w=s[i]-'a'))addedge(x,++tot,w);
        x=son(x,w);
        if(i==j-1)v[x]=p;
      }
    }
    void dfs(int x){
      if(v[x])a[v[x]]=++now;
      seq[st[x]=++dfn]=a[v[x]];
      for(int i=0;i<26;i++)if(son(x,i))dfs(son(x,i));
      en[x]=dfn;
    }
    int add(int x,int a,int b,int c){
      int y=++cnt;
      val[y]=val[x]+1;
      if(a==b)return y;
      int mid=(a+b)>>1;
      if(c<=mid)l[y]=add(l[x],a,mid,c),r[y]=r[x];else l[y]=l[x],r[y]=add(r[x],mid+1,b,c);
      return y;
    }
    inline int ask(int k){
      int x=0,i=0,j=std::strlen(ch),w,y,c=1,d=n,mid;
      for(;i<j;x=son(x,w),i++)if(!son(x,w=ch[i]-'a'))return -1;
      y=root[st[x]-1],x=root[en[x]];
      if(val[x]-val[y]<k)return -1;
      while(c<d){
        mid=(c+d)>>1,j=val[l[x]]-val[l[y]];
        if(k<=j)d=mid,x=l[x],y=l[y];else k-=j,c=mid+1,x=r[x],y=r[y];
      }
      return b[c];
    }
    int main(){
      scanf("%d%d",&n,&q);
      for(i=1;i<=n;i++)scanf("%s",s),ins(i);
      for(dfs(0),i=1;i<=n;i++)b[a[i]]=i;
      for(i=1;i<=dfn;i++)root[i]=seq[i]?add(root[i-1],1,n,seq[i]):root[i-1];
      while(q--)scanf("%d%s",&k,ch),printf("%d
    ",ask(k));
      return 0;
    }
    

      

  • 相关阅读:
    Java后端工程师的学习技术栈
    ltp 分析 fail testcase
    程序员这个职业需要具备的素养
    你真的愿意到了50岁还要做编程吗?
    程序员的学习和积累
    程序员写博客的缘由
    VS2010生成文件
    从菜鸟到专家的五步编程语言学习法
    程序设计的18大原则
    怎样的代码才算是干净的代码?
  • 原文地址:https://www.cnblogs.com/clrs97/p/4403214.html
Copyright © 2020-2023  润新知