#include <bits/stdc++.h>
#define maxn 200005
using namespace std;
typedef long long ll;
char pp[4005][3];
int mp[205][205];
vector<int> v[4005];
int vis[4005], cnt = 0, k1[4005], k2[4005], kk = 0;
char str[4], ans[200010];
void dfs(int j){//记录欧拉路径
while(vis[j] < v[j].size()){
dfs(v[j][vis[j]++]);
}
ans[kk++] = pp[j][1];
}
int find(int b){
int j = b;
while(j != vis[j])
j = vis[j];
int ss = b;
while(vis[ss] != j){
b = vis[ss];
vis[ss] = j;
ss = b;
}
return j;
}
int main(){
// freopen("in.txt", "r", stdin);
int n, from, to;
scanf("%d", &n);
for(int i = 1; i <= 4000; i++)
vis[i] = i;
for(int i = 0; i < n; i++){
scanf("%s", str);
if(mp[str[0]][str[1]] == 0){
mp[str[0]][str[1]] = ++cnt;
pp[cnt][0] = str[0];
pp[cnt][1] = str[1];
from = cnt;
}
else
from = mp[str[0]][str[1]];
if(mp[str[1]][str[2]] == 0){
mp[str[1]][str[2]] = ++cnt;
pp[cnt][0] = str[1];
pp[cnt][1] = str[2];
to = cnt;
}
else
to = mp[str[1]][str[2]];
v[from].push_back(to);
k2[from]++;
k1[to]++;
int b1 = find(from), b2 = find(to);
if(b1 != b2)
vis[b1] = b2;
}
int c = 0;
for(int i = 1; i <= cnt; i++)
if(vis[i] == i){
c++;
}
if(c > 1){
puts("NO");
return 0;
}
int s1 = -1, s2 = -1, f = 0;
for(int i = 1; i <= cnt; i++){
if(abs(k1[i] - k2[i]) > 1){
puts("NO");
return 0;
}
if(k1[i] > k2[i]){
s1 = i;
f++;
}
if(k2[i] > k1[i]){
s2 = i;
f++;
}
}
if(f > 2){
puts("NO");
return 0;
}
if(s1 == -1 && s2 == -1){
s2 = 1;
puts("YES");
}
else
if(s1 != -1 && s2 != -1)
puts("YES");
memset(vis, 0, sizeof(vis));
dfs(s2);
printf("%c", pp[s2][0]);
for(int i = kk - 1; i >= 0; i--)
printf("%c", ans[i]);
puts("");
return 0;
}
“相关推荐”对你有帮助么?
-
非常没帮助
-
没帮助
-
一般
-
有帮助
-
非常有帮助
提交