Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- //#pragma GCC optimize("Ofast,no-stack-protector")
- //#pragma GCC target("avx")
- #include <vector>
- #include <iostream>
- #include <algorithm>
- #include <cmath>
- #include <string>
- #include <set>
- #include <map>
- using namespace std;
- #define re return
- #define pb push_back
- #define eb emplace_back
- #define all(x) (x).begin(), (x).end()
- #define fi first
- #define se second
- #define sqrt(x) sqrt(abs(x))
- #define pi (3.14159265358979323846264338327950288419716939937510)
- #define unique(v) v.resize(unique(all(v)) - v.begin())
- #define bipbup ios_base::sync_with_stdio(false); cin.tie(0); cout.tie(0)
- typedef vector<int> vi;
- typedef vector<vi> vvi;
- typedef pair<int, int> ii;
- typedef vector<ii> vii;
- typedef vector<string> vs;
- typedef double D;
- typedef long double ld;
- typedef long long ll;
- typedef pair<ll, ll> pll;
- typedef vector<ll> vll;
- typedef unsigned long long ull;
- const int N = 1001;
- set <int> mayor;
- map <string, int> mp;
- string str[N];
- int parent[N], rang[N], st[N];
- bool cmp(vi v, vi v1)
- {
- int s1 = v.size(), s2 = v1.size();
- return (s1 > s2);
- }
- int find_set(int v)
- {
- if (v == parent[v])
- return v;
- return parent[v] = find_set(parent[v]);
- }
- void union_sets(int a, int b)
- {
- a = find_set(a);
- b = find_set(b);
- if (a != b)
- {
- if (rang[a] < rang[b])
- swap(a, b);
- parent[b] = a;
- if (rang[a] == rang[b])
- ++rang[a];
- }
- }
- int main()
- {
- bipbup;
- int n;
- cin >> n;
- for (int i = 0; i < n; ++i)
- {
- cin >> str[i];
- //cout << " " << i << '\n';
- mp.insert({ str[i],i });
- parent[i] = i;
- rang[i] = 1;
- st[i] = 3;
- }
- int m;
- cin >> m;
- string name1, name2, cmd, cmd1, cmd2;
- for (int i = 0; i < m; ++i)
- {
- cin >> name1 >> cmd;
- int num1 = mp[name1];
- if (st[num1] <= 1)
- {
- cout << "FAKE";
- return 0;
- }
- if (cmd == "HIT")
- {
- cin >> name2;
- int num2 = mp[name2];
- cin >> cmd1 >> cmd2;
- if (cmd2 == "HEAD")
- st[num2] = max(0, st[num2] - 2);
- else if (cmd2 == "BODY")
- st[num2] = max(0, st[num2] - 1);
- }
- if (cmd == "USES")
- {
- cin >> cmd1;
- st[num1] = 3;
- }
- if (cmd == "REVIVE")
- {
- cin >> name2;
- int num2 = mp[name2];
- if (st[num2] != 1)
- {
- cout << "FAKE";
- return 0;
- }
- st[num2] = 2;
- union_sets(num1, num2);
- }
- //cout<<name1<<' '<<name2<<' '<<cmd<<' '<<cmd1<<'\n';
- }
- for(int i=0;i<n;++i)
- mayor.insert(find_set(i));
- /*for (const auto& i : mayor)
- {
- cout << i << endl;
- }*/
- vvi t(n);
- for (int i = 0; i < n; ++i)
- t[find_set(i)].pb(i);
- sort(all(t), cmp);
- int i = n - 1;
- while (true)
- {
- int s = t[i].size();
- if (s == 0)
- {
- t.pop_back();
- i--;
- n--;
- }
- else
- break;
- }
- for (int i = 0; i < n; ++i)
- {
- int sss = t[i].size();
- if (sss == 3)
- {
- int ssss = t[n - 1].size();
- if (ssss == 1)
- {
- t[i].pb(t[n - 1][0]);
- t.pop_back();
- n--;
- }
- }
- /*else if (sss == 2)
- {
- while (sss < 4)
- {
- }
- }*/
- }
- cout << "CORRECT\n";
- for(int i=0;i<n;++i)
- {
- int sss = t[i].size();
- for (int j = 0; j < sss; ++j)
- cout << str[t[i][j]] << ' ';
- cout << '\n';
- }
- return 0;
- }
- /*
- 8
- a
- b
- c
- d
- e
- f
- g
- h
- 12
- a HIT h IN HEAD
- a HIT g IN HEAD
- a HIT f IN HEAD
- e HIT d IN HEAD
- e HIT c IN HEAD
- e HIT b IN HEAD
- a REVIVE b
- a REVIVE c
- e REVIVE g
- e REVIVE f
- e REVIVE h
- e HIT d IN HEAD
- */
Add Comment
Please, Sign In to add comment