就是把数组里面的所有数都插入一个Trie中,然后遍历Trie即可,这种做法在P1177中好像跑得比sort快,但是值域大一点就不如nlogn算法,(还可以拓展到负数,但是我太菜了懒得写) 下面是P1177的代码
#include <bits/stdc++.h>
using namespace std;
const int N = 1e5 + 10, M = 15;
int t[N * M][10], belong[N * M], cnt[N * M], idx;
char s[N][M];
inline void insert(int id)
{
int p = 0, l = strlen(s[id] + 1);
for (int i = 1; i <= 10; i++)
{
int c = i < (10 - l + 1) ? 0 : s[id][i + l - 10] - '0';
if (!t[p][c]) t[p][c] = ++idx;
p = t[p][c];
}
belong[p] = id;
cnt[p]++;
}
inline void dfs(int u)
{
if (belong[u])
{
for (int i = 1; i <= cnt[u]; i++)
printf("%s ", s[belong[u]] + 1);
return;
}
for (int i = 0; i <= 9; i++)
if (t[u][i])
dfs(t[u][i]);
}
int main()
{
int n;
scanf("%d", &n);
for (int i = 1; i <= n; i++)
{
scanf("%s", s[i] + 1);
insert(i);
}
dfs(0);
return 0;
}