BZOJ3998:[TJOI2015]弦论——题解
生活随笔
收集整理的這篇文章主要介紹了
BZOJ3998:[TJOI2015]弦论——题解
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
https://www.lydsy.com/JudgeOnline/problem.php?id=3998
https://www.luogu.org/problemnew/show/P3975
對于一個給定長度為N的字符串,求它的第K小子串是什么。
后綴自動機,對l排序然后從后往前推size和sum數組(貌似也可以叫拓撲?)。
size:當前狀態的字符串個數(貢獻)。
sum:以當前狀態為起點之后的滿足要求的字符串個數。
#include<cstdio> #include<iostream> #include<queue> #include<cstring> #include<algorithm> #include<cctype> using namespace std; typedef long long ll; const int N=1e6+5; struct tree{int a[26],fa,l; }tr[N]; char s[N]; int last,cnt,t,k; ll a[N],w[N],size[N],sum[N]; inline void insert(int c){int p=last,np=++cnt;last=np;tr[np].l=tr[p].l+1;for(;p&&!tr[p].a[c];p=tr[p].fa)tr[p].a[c]=np;if(!p)tr[np].fa=1;else{int q=tr[p].a[c];if(tr[p].l+1==tr[q].l)tr[np].fa=q;else{int nq=++cnt;tr[nq].l=tr[p].l+1;memcpy(tr[nq].a,tr[q].a,sizeof(tr[q].a));tr[nq].fa=tr[q].fa;tr[q].fa=tr[np].fa=nq;for(;p&&tr[p].a[c]==q;p=tr[p].fa)tr[p].a[c]=nq;}}size[np]=1; } int main(){scanf("%s%d%d",s,&t,&k);int len=strlen(s);last=cnt=1;for(int i=0;i<len;i++)insert(s[i]-'a');for(int i=1;i<=cnt;i++)w[tr[i].l]++;for(int i=1;i<=len;i++)w[i]+=w[i-1];for(int i=1;i<=cnt;i++)a[w[tr[i].l]--]=i;for(int i=cnt;i>=1;i--){if(t)size[tr[a[i]].fa]+=size[a[i]];else size[a[i]]=1;}size[1]=0;for(int i=cnt;i>=1;i--){sum[a[i]]=size[a[i]];for(int j=0;j<26;j++)if(tr[a[i]].a[j])sum[a[i]]+=sum[tr[a[i]].a[j]];}if(k>sum[1])puts("-1");else{int now=1;while(k>size[now]){k-=size[now];int i;for(int i=0;i<26;i++){if(k>sum[tr[now].a[i]])k-=sum[tr[now].a[i]];else{now=tr[now].a[i];putchar(i+'a');break;}}}puts("");}return 0; }+++++++++++++++++++++++++++++++++++++++++++
+本文作者:luyouqi233。 +
+歡迎訪問我的博客:http://www.cnblogs.com/luyouqi233/+
+++++++++++++++++++++++++++++++++++++++++++
轉載于:https://www.cnblogs.com/luyouqi233/p/8776119.html
總結
以上是生活随笔為你收集整理的BZOJ3998:[TJOI2015]弦论——题解的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 为什么静态成员、静态方法中不能用this
- 下一篇: dict字典方法