trie 10pts求助
查看原帖
trie 10pts求助
756660
B612Dusk楼主2023/11/16 09:06

rt,把名字断开存进 trie 树然后按字典序从小到大输出, ensxens_x 表示以 x 号节点结尾的是第几个名字,axa_x 先用作记录名字的串,后用作 dfsdfs 到当前节点时对应的串

trie板子都不会了,我就是个ji

#include <bits/stdc++.h>
using namespace std;

const int N = 5e6 + 10;

inline int read()
{
    int t;
    scanf("%d", &t);
    return t;
}

int trie[N][26], n, len, ens[N], tot;
char a[N], names[N], ans[N];

inline void insert(char s[], int id)
{
    int p = 0;
    s[1] -= 'A' - 'a';
    for(int i = 1;i <= len;i = -~i)
    {
        int ch = s[i] - 'a';
        if(!trie[p][ch])    trie[p][ch] = ++ tot;
        p = trie[p][ch];
    }
    ens[p] = id;
}
int lmt;
inline void dfs(int p) // 
{
    if(ens[p] > lmt)
    {
        lmt = ens[p];
        putchar(a[1] + 'A' - 'a');
        for(int i = 2;i <= len;i = -~i)
            putchar(a[i]);
    }
    for(int i = 0;i < 26;i = -~i)
        if(trie[p][i])  a[++ len] = (char)(i + 'a'), dfs(trie[p][i]), -- len;
}

signed main()
{
    scanf("%s", names + 1);
    int id = 0;
    n = strlen(names + 1);
    for(int i = 1;i <= n;i = -~i)
    {
        a[++ len] = names[i], ++ i;
        while(i <= n and names[i] >= 'a' and names[i] <= 'z')   a[++ len] = names[i], ++ i;
        -- i, insert(a, ++ id);
        len = 0;
    }
    dfs(0);
    return 0;
}
2023/11/16 09:06
加载中...