解析
之前模拟考过的一道题
把字符串当成前后缀之间的连边即可
注意即使图的度数符合要求,也可能由于不连通而无解,需要再特判一下
#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define ull unsigned long long
const int N=2e5+100;
ll read() {ll x=0,f=1;char c=getchar();while(!isdigit(c)) {if(c=='-')f=-1;c=getchar();}while(isdigit(c)) {x=x*10+(c^48);c=getchar();}return x*f;
}
int n,m;
int key=123;
struct node{int to,nxt;
}p[N<<1];
int fi[N],cnt;
inline void addline(int x,int y){p[++cnt]=(node){y,fi[x]};fi[x]=cnt;return;
}
int in[N],out[N];
int zhan[N],top;
char s[4];
void dfs(int x){for(int i=fi[x];~i;i=fi[x]){int to=p[i].to;fi[x]=p[i].nxt;dfs(to);}zhan[++top]=x;
}
int main(){//freopen("a.in","r",stdin);//freopen("a.out","w",stdout);memset(fi,-1,sizeof(fi));cnt=-1;n=read();for(int i=1;i<=n;i++){scanf(" %s",s+1);int a=s[1]*key+s[2],b=s[2]*123+s[3];in[b]++;out[a]++;addline(a,b);}int id(0),num(0);for(int i=1;i<=15252;i++){if(!in[i]&&!out[i]) continue;if(abs(out[i]-in[i])>1){printf("NO\n");return 0;}else if(out[i]>in[i]){num++;id=i;}else if(!id) id=i;}if(num>1){printf("NO\n");return 0;}dfs(id);if(top!=n+1) printf("NO\n");else{printf("YES\n");printf("%c%c",zhan[top]/key,zhan[top]%key);top--;while(top){putchar(zhan[top]%key);top--;}}return 0;
}
/**/