Advertisement
Dang_Quan_10_Tin

BAI4 HSGHN L12 V1 2019-2020

Dec 20th, 2021
953
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.94 KB | None | 0 0
  1. #define task "BAI4"
  2.  
  3. #include <iostream>
  4. #include <cstdio>
  5. #include <vector>
  6. #include <algorithm>
  7. #include <queue>
  8.  
  9. using namespace std;
  10.  
  11. using ll = long long;
  12. using ld = long double;
  13.  
  14. constexpr int N = 1e5 + 5;
  15. int x[] = {0, 0, 1, -1},
  16.     y[] = {1, -1, 0, 0};
  17.  
  18. int d[N];
  19. string s;
  20. vector<int> adj[N];
  21. vector<pair<int, int>> v;
  22.  
  23. void Read()
  24. {
  25.     cin >> s;
  26. }
  27.  
  28. int Get(char x)
  29. {
  30.     switch (x)
  31.     {
  32.     case 'D':
  33.         return 0;
  34.     case 'T':
  35.         return 1;
  36.     case 'N':
  37.         return 2;
  38.     case 'B':
  39.         return 3;
  40.     }
  41.     return -1;
  42. }
  43.  
  44. void Solve()
  45. {
  46.     /* Make Graph */
  47.     pair<int, int> now = {0, 0};
  48.     v.emplace_back(now);
  49.  
  50.     for (auto i : s)
  51.     {
  52.         now = {now.first + x[Get(i)], now.second + y[Get(i)]};
  53.         v.emplace_back(now);
  54.     }
  55.     sort(v.begin(), v.end());
  56.     v.resize(unique(v.begin(), v.end()) - v.begin());
  57.  
  58. #define Find(x, v) (lower_bound(x.begin(), x.end(), v) - x.begin() + 1)
  59.  
  60.     now = {0, 0};
  61.  
  62.     for (auto i : s)
  63.     {
  64.         int j = Find(v, now);
  65.         now = {now.first + x[Get(i)], now.second + y[Get(i)]};
  66.         int t = Find(v, now);
  67.  
  68.         adj[j].emplace_back(t);
  69.         adj[t].emplace_back(j);
  70.     }
  71.  
  72.     /* Calculate Shortest Path using BFS */
  73.  
  74.     d[Find(v, now)] = 1;
  75.     queue<int> q({Find(v, now)});
  76.     now = {0, 0};
  77.     int piv = Find(v, now);
  78.  
  79.     while (!q.empty())
  80.     {
  81.         int c = q.front();
  82.         q.pop();
  83.  
  84.         if (c == piv)
  85.         {
  86.             cout << d[c] - 1;
  87.             return;
  88.         }
  89.  
  90.         for (auto i : adj[c])
  91.             if (!d[i])
  92.             {
  93.                 d[i] = d[c] + 1;
  94.                 q.emplace(i);
  95.             }
  96.     }
  97. }
  98.  
  99. int32_t main()
  100. {
  101.     ios::sync_with_stdio(0);
  102.     cin.tie(0);
  103.     cout.tie(0);
  104.     if (fopen(task ".INP", "r"))
  105.     {
  106.         freopen(task ".INP", "r", stdin);
  107.         freopen(task ".OUT", "w", stdout);
  108.     }
  109.  
  110.     Read();
  111.     Solve();
  112. }
  113.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement