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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

SPOJ 7258 Lexicographical Substring Search(后缀自动机)

發布時間:2023/12/20 编程问答 23 豆豆
生活随笔 收集整理的這篇文章主要介紹了 SPOJ 7258 Lexicographical Substring Search(后缀自动机) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

題目鏈接:http://www.spoj.com/problems/SUBLEX/

題意:給定一個字符串,每次詢問第K小的串。

思路:建立自動機。cnt[p]=sigama(cnt[son[p][i]])+1。

const int KIND=26; char s[N]; int pre[N],Lth[N],son[N][KIND+1]; i64 cnt[N]; int e,n,last;void insert() {clr(son,-1); e=0;pre[e]=-1; Lth[e]=0; last=e++;int i,r,p,q,u,x;FOR0(i,n){x=s[i]-'a';u=last; pre[e]=-1; Lth[e]=i+1; last=p=e++;for(;u!=-1&&son[u][x]==-1;u=pre[u]) son[u][x]=p;if(u==-1) pre[p]=0;else{q=son[u][x];if(Lth[q]==Lth[u]+1) pre[p]=q;else{pre[e]=pre[q]; Lth[e]=Lth[u]+1;memcpy(son[e],son[q],sizeof(son[e]));r=e++;pre[p]=pre[q]=r;for(;u!=-1&&son[u][x]==q;u=pre[u]) son[u][x]=r;}}} }int d[N],Q[N]; char transChar[N];void init() {int i,j,k,p;FOR0(i,n+1) d[i]=0;FOR0(i,e) d[Lth[i]]++;FOR1(i,n) d[i]+=d[i-1];FOR0(i,e) Q[--d[Lth[i]]]=i;FORL0(i,e-1){p=Q[i]; cnt[p]=1; k=0;FOR0(j,KIND) if(son[p][j]!=-1){cnt[p]+=cnt[son[p][j]];son[p][k++]=son[p][j];transChar[son[p][j]]=j+'a';}son[p][k]=-1;} }int main() {RD(s); n=strlen(s); insert(); init();int Q,len,i,p,q;i64 K;RD(Q);while(Q--){RD(K); p=0; len=0;while(K){i=0;K--;while(son[p][i]!=-1){q=son[p][i];if(K>=cnt[q]) K-=cnt[q];else{s[len++]=transChar[q];p=q;break;}i++;}}s[len]=0;puts(s);} }

  

總結

以上是生活随笔為你收集整理的SPOJ 7258 Lexicographical Substring Search(后缀自动机)的全部內容,希望文章能夠幫你解決所遇到的問題。

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