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 }

浙公网安备 33010602011771号