日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

BZOJ3448 : [Usaco2014 Feb]Auto-complete

發布時間:2023/12/15 编程问答 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 BZOJ3448 : [Usaco2014 Feb]Auto-complete 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

RE了幾十發,實在沒辦法了…只好向管理員要數據,然后發現數據規模與題目描述不符…

建立Trie并求出DFS序,同時根據DFS序確定字典序

然后每次詢問相當于詢問子樹第k小,用主席樹維護,注意壓縮內存

時間復雜度$O(L+n\log 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\n",ask(k));return 0; }

  

?

總結

以上是生活随笔為你收集整理的BZOJ3448 : [Usaco2014 Feb]Auto-complete的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。