把第一二个字母 和 第二三个字母都看成点 寻找欧拉路径
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<vector>
#include<queue>
#include<deque>
#include<iostream>
#include<map>
#define SF scanf
#define PF printf
using namespace std;
typedef long long LL;
const int MAXN = 200000;
const int MAXP = 3850;
int ans[MAXN+10], N;
inline int ID(char c)
{
if('0' <= c && c <= '9') return c - '0';
if('a' <= c && c <= 'z') return c - 'a' + 10;
return c - 'A' + 36;
}
inline void print(int x)
{
if(0 <= x && x <= 9) putchar(x+'0');
else if(10 <= x && x < 36) putchar(x-10+'a');
else putchar(x-36+'A');
}
int ind[MAXP+10], out[MAXP+10], G[MAXP+10][MAXP+10];
int check()
{
int Front = -1;
for(int i = 0; i <= MAXP; i++) {
if(abs(ind[i] - out[i] > 1)) return -1;
if(out[i] > ind[i]) {
if(~Front) return -1;
else Front = i;
}
}
if(Front == -1) for(int i = 0; i <= MAXP; i++) if(out[i]) { Front = i; break; }
return Front;
}
void dfs(int u)
{
for(int v = 0; v <= MAXP; v++)
while(G[u][v])
{
G[u][v]--;
dfs(v);
ans[++N] = v;
}
}
int main()
{
int n; SF("%d", &n);
char s[10];
for(int i = 1; i <= n; i++)
{
SF("%s", s);
int u = 62 * ID(s[0]) + ID(s[1]);
int v = 62 * ID(s[1]) + ID(s[2]);
out[u]++; ind[v]++; G[u][v]++;
}
int Front = check();
if(Front == -1) { puts("NO"); return 0; }
dfs(Front); ans[++N] = Front;
if(N != n+1) { puts("NO"); return 0;}
puts("YES");
for(int i = N; i >= 1; i--)
{
if(i == N) { print(ans[i]/62); print(ans[i]%62); }
else print(ans[i]%62);
}
}