CF 508D Tanya and Password(欧拉路径)

题目链接:https://www.luogu.com.cn/problem/CF508D

 1 #include <bits/stdc++.h>
 2 using namespace std;
 3 const int N=400011,St=233,MAX_N=400000;
 4 int n,len;
 5 int ru[N],chu[N],cnt[N];
 6 vector<int> e[N];
 7 char ans[N];
 8 
 9 void dfs(int d) {
10 //    printf("%d: %d\n",d,cnt[22699]);
11     for(;cnt[d]<e[d].size();)
12         dfs(e[d][cnt[d]++]);
13     ans[++len]=d%St;
14 }
15 
16 int main()
17 {
18     char s[11];
19     scanf("%d",&n);
20     int sumru=0,sumchu=0,lj=1;
21     for(int i=1;i<=n;++i) {
22         scanf("%s",s);
23         int x=s[0]*St+s[1],y=s[1]*St+s[2];
24         e[x].push_back(y);
25         ++chu[x],++ru[y],lj=x;
26     }
27     for(int i=1;i<=MAX_N;++i) {
28         int tmp=ru[i]-chu[i];
29         if(tmp==-1) ++sumru,lj=i;
30         else if(tmp==1) ++sumchu;
31         else if(tmp) { puts("NO"); return 0; }
32     }
33 //    printf("qwq%d\n",lj);
34     if(sumru>1 || sumchu>1 || sumru+sumchu==1) { puts("NO"); return 0; }
35     dfs(lj);
36     ans[++len]=lj/St;
37     if(len!=n+2) { puts("NO"); return 0; }
38     puts("YES");
39     for(int i=len;i>=1;--i) printf("%c",ans[i]); puts("");
40     return 0;
41 }

 

posted @ 2021-05-29 18:11  上官书房  阅读(58)  评论(0)    收藏  举报