1
0

CodeForces-508D.cpp 2.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475
  1. #include <algorithm>
  2. #include <iostream>
  3. #include <string>
  4. #include <vector>
  5. using namespace std;
  6. int code(char c) {
  7. if ('a' <= c && c <= 'z') return c - 'a';
  8. if ('A' <= c && c <= 'Z') return 26 + c - 'A';
  9. return 52 + c - '0';
  10. }
  11. char decode(int x) {
  12. if (x < 26) return static_cast<char>('a' + x);
  13. if (x < 52) return static_cast<char>('A' + x - 26);
  14. return static_cast<char>('0' + x - 52);
  15. }
  16. int main() {
  17. ios::sync_with_stdio(false);
  18. cin.tie(nullptr);
  19. int n;
  20. cin >> n;
  21. constexpr int sigma = 62;
  22. constexpr int vertices = sigma * sigma;
  23. vector<vector<int>> adj(vertices);
  24. vector<int> in(vertices, 0), out(vertices, 0);
  25. for (int i = 0; i < n; ++i) {
  26. string s;
  27. cin >> s;
  28. int u = code(s[0]) * sigma + code(s[1]);
  29. int v = code(s[1]) * sigma + code(s[2]);
  30. adj[u].push_back(v);
  31. ++out[u]; ++in[v];
  32. }
  33. int start = -1, plus = 0, minus = 0;
  34. bool ok = true;
  35. for (int v = 0; v < vertices; ++v) {
  36. int diff = out[v] - in[v];
  37. if (diff == 1) { ++plus; start = v; }
  38. else if (diff == -1) ++minus;
  39. else if (diff != 0) ok = false;
  40. if (start == -1 && out[v] > 0) start = v;
  41. }
  42. ok = ok && ((plus == 0 && minus == 0) || (plus == 1 && minus == 1));
  43. if (!ok || start == -1) {
  44. cout << "NO\n";
  45. return 0;
  46. }
  47. vector<size_t> cursor(vertices, 0);
  48. vector<int> st{start}, path;
  49. path.reserve(n + 1);
  50. while (!st.empty()) {
  51. int v = st.back();
  52. if (cursor[v] == adj[v].size()) {
  53. path.push_back(v);
  54. st.pop_back();
  55. } else {
  56. st.push_back(adj[v][cursor[v]++]);
  57. }
  58. }
  59. if (static_cast<int>(path.size()) != n + 1) {
  60. cout << "NO\n";
  61. return 0;
  62. }
  63. reverse(path.begin(), path.end());
  64. cout << "YES\n";
  65. cout << decode(path[0] / sigma) << decode(path[0] % sigma);
  66. for (int i = 1; i <= n; ++i) cout << decode(path[i] % sigma);
  67. cout << '\n';
  68. }