Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- string s[MAX];map<string ,int >m;map<int,string>res;int cnt,o[MAX],in[MAX],pnt,flag,start;vi v[MAX],ans;
- int check(string ss)
- {
- if(m[ss]==0)
- {
- m[ss] = cnt;
- res[cnt] = ss;
- cnt++;
- }
- return m[ss];
- }
- void again(int x)
- {
- if(in[x]==o[x])return ;
- else
- {
- /// cout<<abs(in[x]-o[x])<<" "<<res[x]<<endl;
- if(abs(in[x]-o[x])>1)flag = 1;
- else if(o[x]-in[x]==1)start = x,pnt++;
- else pnt++;
- }
- }
- void dfs(int s)
- {
- while(v[s].size())
- {
- int x = v[s][v[s].size() - 1];
- v[s].pop_back();
- dfs(x);
- }
- ans.pb(s);
- }
- int main()
- {
- booster()
- ///read("input.txt");
- cnt = 1;
- int n;
- cin>>n;
- for(int i = 0;i<n;i++)
- {
- cin>>s[i];
- int x = check(s[i].substr(0,2));
- int y = check(s[i].substr(1,2));
- o[x]++;
- in[y]++;
- v[x].pb(y);
- }
- start = 1;
- for(int i = 1;i<=cnt;i++)
- {
- again(i);
- }
- dfs(start);
- if(flag||ans.size()!=n+1||pnt>2)cout<<"NO";
- else
- {
- cout<<"YES";
- cout<<endl;
- reverse(all(ans));
- for(int i = 0;i<ans.size();i++)
- {
- if(!i)cout<<res[ans[i]];
- else cout<<res[ans[i]][1];
- }
- }
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement