萌新求助SAM
查看原帖
萌新求助SAM
339846
RuntimeErr楼主2021/7/16 17:04

rt,50pts,错误的测试点全部都显示too long on line 2,可是输出只有一行啊

#include<cstdio>
#include<iostream>
#include<algorithm>
using namespace std;

const int N=5e5+10,M=N<<1;
typedef long long ll;

char s[N];int t,k;
int lst,tot,fa[M],ch[M][26],len[M];
int cnt[M],a[M],size[M],sum[M];

void add(int c){
    int p=lst,cur=++tot;
    lst=cur;len[cur]=len[p]+1;size[cur]=1;
    for(;!ch[p][c];p=fa[p])ch[p][c]=cur;
    if(!p)fa[cur]=1;
    else {
        int q=ch[p][c];
        if(len[q]==len[p]+1)fa[cur]=q;
        else {
            int clone=++tot;len[clone]=len[p]+1;
            for(int i=0;i<26;++i)ch[clone][i]=ch[q][i];
            fa[clone]=fa[q];
            fa[q]=fa[cur]=clone;
            for(;ch[p][c]==q;p=fa[p])ch[p][c]=clone;
        }
    }
}
void dfs(int u,int k){
    if(k<=size[u])return;
    k-=size[u];
    for(int i=0;i<26;++i){
        int p=ch[u][i];
        if(!p)continue;
        if(k>sum[p])k-=sum[p];
        else {
            putchar('a'+i);
            dfs(p,k);
            return;
        }
    }
}

int main(){
    scanf("%s",s+1);lst=tot=1;
    scanf("%d%d",&t,&k);
    for(int i=1;s[i];++i)add(s[i]-'a');
    for(int i=1;i<=tot;++i)++cnt[len[i]];
    for(int i=1;i<=tot;++i)cnt[i]+=cnt[i-1];
    for(int i=1;i<=tot;++i)a[cnt[len[i]]--]=i;
    for(int i=tot;i;--i)size[fa[i]]+=size[i];
    for(int i=2;i<=tot;++i){
        if(!t)sum[i]=size[i]=1;
        else sum[i]=size[i];
    }sum[1]=size[1]=0;
    for(int i=tot;i;--i){
        for(int j=0;j<26;++j){
            if(ch[a[i]][j])sum[a[i]]+=sum[ch[a[i]][j]];
        }
    }
    if(sum[1]<k)puts("-1");
    else dfs(1,k);
    return 0;
}
2021/7/16 17:04
加载中...