MnZn 求助简单题
查看原帖
MnZn 求助简单题
420129
Nt_Tsumiki楼主2024/7/9 15:29

rt

感觉自己跟 SPOJ 有仇

#include <iostream>
#include <cstring>
#include <cstdio>
#include <string>

#define N 200001
#define LL long long

using namespace std;
string s;

int tot=1,np=1,ch[N][26],fail[N],len[N];

void ins(int c) {
    int p=np; len[np=++tot]=len[p]+1;
    while (p and !ch[p][c]) ch[p][c]=np,p=fail[p];
    if (!p) fail[np]=1;
    else {
        int q=ch[p][c];
        if (len[q]==len[p]+1) fail[np]=q;
        else {
            int nq=++tot;
            len[nq]=len[p]+1,fail[nq]=fail[q];
            fail[np]=fail[q]=nq;
            memcpy(ch[nq],ch[q],sizeof ch[q]);
            while (p and ch[p][c]==q) ch[p][c]=nq,p=fail[p];
        }
    }
}

LL siz[N];

void dfs1(int u) {
    if (siz[u]) return;
    siz[u]=(u!=1);
    for (int i=0;i<26;i++) {
        if (!ch[u][i]) continue;
        dfs1(ch[u][i]);
        siz[u]+=siz[ch[u][i]];
    }
}

string ans;

void find(int u,int k) {
    if (k==1) return;
    k-=(u!=1);
    for (int i=0;i<26;i++) {
        if (!ch[u][i]) continue;
        if (siz[ch[u][i]]>=k) return ans.push_back('a'+i),find(ch[u][i],k);
        else k-=siz[ch[u][i]];
    }
}

signed main() {
    cin>>s;
    for (char c:s) ins(c-'a');
    dfs1(1);
    int q; scanf("%d",&q);
    for (int i=1,k;i<=q;i++) {
        scanf("%d",&k);
        if (siz[1]<k) {
            // printf("\n");
            continue;
        }
        ans.clear(); find(1,k);
        cout<<ans<<'\n';
    }
    return 0;
}
2024/7/9 15:29
加载中...