rt,把名字断开存进 trie 树然后按字典序从小到大输出, ensx 表示以 x 号节点结尾的是第几个名字,ax 先用作记录名字的串,后用作 dfs 到当前节点时对应的串
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;
}