O_Egor

Полевые Логи

Nov 20th, 2019
187
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.32 KB | None | 0 0
  1. //#pragma GCC optimize("Ofast,no-stack-protector")
  2. //#pragma GCC target("avx")
  3. #include <vector>
  4. #include <iostream>
  5. #include <algorithm>
  6. #include <cmath>
  7. #include <string>
  8. #include <set>
  9. #include <map>
  10.  
  11. using namespace std;
  12.  
  13. #define re return
  14. #define pb push_back
  15. #define eb emplace_back
  16. #define all(x) (x).begin(), (x).end()
  17. #define fi first
  18. #define se second
  19. #define sqrt(x) sqrt(abs(x))
  20. #define pi (3.14159265358979323846264338327950288419716939937510)
  21. #define unique(v) v.resize(unique(all(v)) - v.begin())
  22. #define bipbup ios_base::sync_with_stdio(false); cin.tie(0); cout.tie(0)
  23.  
  24. typedef vector<int> vi;
  25. typedef vector<vi> vvi;
  26. typedef pair<int, int> ii;
  27. typedef vector<ii> vii;
  28. typedef vector<string> vs;
  29. typedef double D;
  30. typedef long double ld;
  31. typedef long long ll;
  32. typedef pair<ll, ll> pll;
  33. typedef vector<ll> vll;
  34. typedef unsigned long long ull;
  35.  
  36. const int N = 1001;
  37. set <int> mayor;
  38. map <string, int> mp;
  39. string str[N];
  40. int parent[N], rang[N], st[N];
  41.  
  42. bool cmp(vi v, vi v1)
  43. {
  44.     int s1 = v.size(), s2 = v1.size();
  45.     return  (s1 > s2);
  46. }
  47.  
  48. int find_set(int v)
  49. {
  50.     if (v == parent[v])
  51.         return v;
  52.     return parent[v] = find_set(parent[v]);
  53. }
  54.  
  55. void union_sets(int a, int b)
  56. {
  57.     a = find_set(a);
  58.     b = find_set(b);
  59.     if (a != b)
  60.     {
  61.         if (rang[a] < rang[b])
  62.             swap(a, b);
  63.         parent[b] = a;
  64.         if (rang[a] == rang[b])
  65.             ++rang[a];
  66.     }
  67. }
  68.  
  69. int main()
  70. {
  71.     bipbup;
  72.     int n;
  73.     cin >> n;
  74.     for (int i = 0; i < n; ++i)
  75.     {
  76.         cin >> str[i];
  77.         //cout << " " << i << '\n';
  78.         mp.insert({ str[i],i });
  79.         parent[i] = i;
  80.         rang[i] = 1;
  81.         st[i] = 3;
  82.     }
  83.     int m;
  84.     cin >> m;
  85.     string name1, name2, cmd, cmd1, cmd2;
  86.     for (int i = 0; i < m; ++i)
  87.     {
  88.         cin >> name1 >> cmd;
  89.         int num1 = mp[name1];
  90.         if (st[num1] <= 1)
  91.         {
  92.             cout << "FAKE";
  93.             return 0;
  94.         }
  95.         if (cmd == "HIT")
  96.         {
  97.             cin >> name2;
  98.             int num2 = mp[name2];
  99.             cin >> cmd1 >> cmd2;
  100.             if (cmd2 == "HEAD")
  101.                 st[num2] = max(0, st[num2] - 2);
  102.             else if (cmd2 == "BODY")
  103.                 st[num2] = max(0, st[num2] - 1);
  104.         }
  105.         if (cmd == "USES")
  106.         {
  107.             cin >> cmd1;
  108.             st[num1] = 3;
  109.         }
  110.         if (cmd == "REVIVE")
  111.         {
  112.             cin >> name2;
  113.             int num2 = mp[name2];
  114.             if (st[num2] != 1)
  115.             {
  116.                 cout << "FAKE";
  117.                 return 0;
  118.             }
  119.             st[num2] = 2;
  120.             union_sets(num1, num2);
  121.         }
  122.  
  123.         //cout<<name1<<' '<<name2<<' '<<cmd<<' '<<cmd1<<'\n';
  124.     }
  125.     for(int i=0;i<n;++i)
  126.         mayor.insert(find_set(i));
  127.     /*for (const auto& i : mayor)
  128.     {
  129.         cout << i << endl;
  130.     }*/
  131.     vvi t(n);
  132.     for (int i = 0; i < n; ++i)
  133.         t[find_set(i)].pb(i);
  134.     sort(all(t), cmp);
  135.     int i = n - 1;
  136.     while (true)
  137.     {
  138.         int s = t[i].size();
  139.         if (s == 0)
  140.         {
  141.             t.pop_back();
  142.             i--;
  143.             n--;
  144.         }
  145.         else
  146.             break;
  147.     }
  148.     for (int i = 0; i < n; ++i)
  149.     {
  150.         int sss = t[i].size();
  151.         if (sss == 3)
  152.         {
  153.             int ssss = t[n - 1].size();
  154.             if (ssss == 1)
  155.             {
  156.                 t[i].pb(t[n - 1][0]);
  157.                 t.pop_back();
  158.                 n--;
  159.             }
  160.         }
  161.         /*else if (sss == 2)
  162.         {
  163.             while (sss < 4)
  164.             {
  165.  
  166.             }
  167.         }*/
  168.     }
  169.     cout << "CORRECT\n";
  170.     for(int i=0;i<n;++i)
  171.     {
  172.         int sss = t[i].size();
  173.         for (int j = 0; j < sss; ++j)
  174.             cout << str[t[i][j]] << ' ';
  175.         cout << '\n';
  176.     }
  177.     return 0;
  178. }
  179. /*
  180. 8
  181. a
  182. b
  183. c
  184. d
  185. e
  186. f
  187. g
  188. h
  189. 12
  190. a HIT h IN HEAD
  191. a HIT g IN HEAD
  192. a HIT f IN HEAD
  193. e HIT d IN HEAD
  194. e HIT c IN HEAD
  195. e HIT b IN HEAD
  196. a REVIVE b
  197. a REVIVE c
  198. e REVIVE g
  199. e REVIVE f
  200. e REVIVE h
  201. e HIT d IN HEAD
  202. */
Add Comment
Please, Sign In to add comment