恶补字符串然后全WA
样例都过了手玩几组自造的也过了……
#include<bits/stdc++.h>
#define Max 4000001
#define int long long
using namespace std;
struct node
{
int son[26];
int len,fa;
}SAM[Max];
int cnt=1,las=1;
int fi[Max],to[Max],nx[Max],tot,val[Max],dp[Max];
int in[Max];
void link(int a,int b)
{
nx[++tot]=fi[a];
fi[a]=tot;
to[tot]=b;
}
void add(int c)
{
int p=las,np=las=++cnt;val[cnt]=1;
SAM[np].len=SAM[p].len+1;
for(;p&&!SAM[p].son[c];p=SAM[p].fa) SAM[p].son[c]=np;
if(!p) SAM[np].fa=1;
else
{
int q=SAM[p].son[c];
if(SAM[q].len==SAM[p].len+1) SAM[np].fa=q;
else
{
int nq=++cnt;
SAM[nq]=SAM[q],SAM[nq].len=SAM[p].len+1,SAM[q].fa=SAM[np].fa=nq;
for(;p&&SAM[p].son[c]==q;p=SAM[p].fa) SAM[p].son[c]=nq;
}
}
}
void dfs(int x)
{
for(int i=fi[x];i;i=nx[i])
{
int v=to[i];
dfs(v);
val[x]+=val[v];
}
}
void work(int x,int k)
{
if(k<=val[x]) return;
k-=val[x];
for(int i=0;i<26;i++)
if(SAM[x].son[i])
{
if(k>dp[SAM[x].son[i]]) k-=dp[SAM[x].son[i]];
else
{
cout<<(char)(i+'a');
work(SAM[x].son[i],k);
return;
}
}
}
signed main()
{
int k,typ;
string p;
cin>>p;
for(int i=0;i<p.size();i++)
add(p[i]-'a');
cin>>typ>>k;
for(int i=2;i<=cnt;i++)
link(SAM[i].fa,i);
dfs(1);
for(int i=1;i<=cnt;i++) !typ?dp[i]=val[i]=1:dp[i]=val[i];
dp[1]=val[1]=0;
for(int i=cnt;i>=1;i--)
for(int x=0;x<26;x++)
if(SAM[i].son[x])
dp[i]+=dp[SAM[i].son[x]];
int now=1;
if(dp[1]<k) cout<<-1;
else work(1,k);
}
/*
dcbaabcd
1 4
*/