SPOJ 7258 SUBLEX (SAM)(二)

2014-11-24 09:03:05 · 作者: · 浏览: 2
[N];
int tot=0;
int c[N];
char ch[N][26];
void add(int c,int l)
{
SAM *p=tail,*np=&que[tot++];
np->len=l;
while(p&&p->son[c]==NULL) p->son[c]=np,p=p->pre;
if(p==NULL) np->pre=root;
else
{
SAM *q=p->son[c];
if(p->len+1==q->len) np->pre=q;
else
{
SAM *nq=&que[tot++];
*nq=*q;
nq->len=p->len+1;
np->pre=q->pre=nq;
while(p&&p->son[c]==q) p->son[c]=nq,p=p->pre;
}
}
tail=np;
}
void slove(int k)
{
int l=0;
int now=0;
while(k)
{
for(int i=0;i {
if(k>que[son[now][i]].cnt)
{
k-=que[son[now][i]].cnt;
}
else
{
str[l++]=ch[now][i];
now=son[now][i];
k--;
break;
}
}
}
str[l]='\0';
puts(str);
}
int main()
{
root=tail=&que[tot++];
scanf("%s",str);
int l=strlen(str);
for(int i=0;str[i];i++) add(str[i]-'a',i+1);
for(int i=0;i for(int i=1;i for(int i=0;i for(int i=0;i for(int i=tot-1;i>=0;i--)
{
SAM *p=b[i];
for(int j=0;j<26;j++)
{
if(p->son[j])
{
int u=p-que,v=p->son[j]-que;
son[u][cnt[u]]=v;
ch[u][cnt[u]++]=j+'a';
p->cnt+=p->son[j]->cnt;
}
}
}
int q,k;
scanf("%d",&q);
while(q--)
{
scanf("%d",&k);
slove(k);
}
return 0;
}