답안 #466432

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
466432 2021-08-19T08:52:37 Z BrainForces Klasika (COCI20_klasika) C++11
0 / 110
925 ms 131560 KB
#include <bits/stdc++.h>

using namespace std;

// Templates here
template<typename T1, typename T2, typename T3>
class triple {
public:
    T1 first;
    T2 second;
    T3 third;

    triple() {
        first = 0;
        second = 0;
        third = 0;
    }
};

// Typedefs here
typedef long long ll;
typedef long double ld;
typedef pair<int, int> pii;
typedef pair<ll, ll> pll;
typedef vector<int> vi;
typedef vector<ll> vl;
typedef vector<pii> vpii;
typedef vector<pll> vpll;
typedef set<int> si;
typedef set<ll> sl;
typedef set<pii> spii;
typedef set<pll> spll;
typedef map<string, int> mpsi;
typedef map<string, ll> mpsl;
typedef map<int, int> mpii;
typedef map<ll, ll> mpll;

// Defines here
#define IOS ios::sync_with_stdio(false),cin.tie(0),cout.tie(0);
#define fora(i, a, b) for(int (i)=(a);(i)<(b);(i)++)
#define forla(i, a, b) for(ll (i)=(a);(i)<(b);(i)++)
#define for0(i, b) fora((i),0,(b))
#define forl0(i, b) forla((i),0,(b))
#define rofa(i, a, b) for(int (i)=(a);(i)>=(b);(i)--)
#define rofla(i, a, b) for(ll (i)=(a);(i)>=(b);(i)--)
#define rof0(i, a) rofa((i),(a),0)
#define rofl0(i, a) rofla((i),(a),0)
#define forag(i, a, b, g) for(int (i)=(a);(i)<(b);(i)+=(g))
#define forlag(i, a, b, g) for(ll (i)=(a);(i)<(b);(i)+=(g))
#define for0g(i, b, g) forag((i),0,(b),(g))
#define forl0g(i, b, g) forlag((i),0,(b),(g))
#define rofag(i, a, b, g) for(int (i)=(a);(i)>=(b);(i)-=(g))
#define roflag(i, a, b, g) for(ll (i)=(a);(i)>=(b);(i)-=(g))
#define rof0g(i, a, g) rofag((i),(a),0,(g))
#define rofl0g(i, a, g) roflag((i),(a),0,(g))
#define all(x) (x).begin(),(x).end()
#define pb push_back
#define pf push_front
#define MP make_pair
#define F first
#define S second
#define GraphM1(g, n) int (g)[(n)][(n)]
#define GraphM2(g, n) vi (g)[(n)]


// Const variables here
const int maxn = 2e5 + 5;

// Before structs global variables here


// Structs here
struct Node {
    Node *child[2];
    Node *p = nullptr;

    int h, id, cnt;
    si s;

    Node() {
        h = -1;
        id = -1;
        cnt = 0;
        for (auto &i : child)
            i = nullptr;
    }
};

struct Trie {
    Node *root;
    int strType, cnt;

    Trie() {
        strType = '0';
        cnt = 1;

        root = new Node();
        root->h = 0;
        root->id = 1;
    }

    void add(string st, int num) {
        Node *cur = root;
        cur->cnt++;
        cur->s.insert(num);

        for (char c:st) {
            int x = int(c) - strType;

            if (cur->child[x] == nullptr) {
                cur->child[x] = new Node();
                Node *next = cur->child[x];
                
                next->p = cur;
                next->h = cur->h + 1;
                next->id = ++cnt;
            }

            cur = cur->child[x];
            cur->cnt++;
            cur->s.insert(num);
        }
    }
};

// Global variables here
int st[maxn], et[maxn], A[maxn];
vpii g[maxn];
vector<pair<int, pii>> query;
int temp;

// Functions here
string Base2(int x) {
    string ans;

    while (x > 0) {
        ans += to_string(x % 2);
        x /= 2;
    }

    reverse(all(ans));

    while (ans.size() < 31)
        ans = '0' + ans;

    return ans;
}

int Base10(string s) {
    int ans = 0, po = 1;

    rof0(i,(int)s.size()-1) {
        ans += (s[i] == '0') * po;
        po *= 2;
    }

    return ans;
}

void dfs(int x) {
    st[x] = temp++;

    for0(i, (int) g[x].size()) {
        A[g[x][i].F] = (A[x] ^ g[x][i].S);

        dfs(g[x][i].F);
    }

    et[x] = temp++;
}

string find(int x, int y, Node *root) {
    string mab = Base2(A[x]);
    string ans;

    Node *cur = root;

    for (char c:mab) {
        int temp1 = c - '0';
        int temp2 = (temp1 ^ 1);

        if (cur->child[temp2] and !cur->child[temp2]->s.empty()) {
            auto it = cur->child[temp2]->s.lower_bound(st[y]);

            if (it != cur->child[temp2]->s.end() and *it <= et[y]) {
                cur = cur->child[temp2];
                ans += '1';
                continue;
            }
        }

        cur = cur->child[temp1];
        ans += '0';
    }

    return ans;
}

// Main here
int main() {
    IOS

    int n;
    cin >> n;
    int id = 1;

    for0(i, n) {
        string s;
        int a, b;
        cin >> s >> a >> b;
        
        if (s == "Add") {
            g[a].pb(MP(++id, b));
            query.pb(MP(1, MP(id, 0)));
        } else
            query.pb(MP(2, MP(a, b)));

    }

    dfs(1);
    Trie *T = new Trie();
    T->add(Base2(A[1]), st[1]);

    for0(q, n) {
        int qt = query[q].F;

        if (qt == 1) {
            int x = query[q].S.F;
            T->add(Base2(A[x]), st[x]);
        } else {
            int x = query[q].S.F, b = query[q].S.S;
            string ret = find(x, b, T->root);

            cout << Base10(ret) << "\n";
        }
    }

    return 0;
}

Compilation message

klasika.cpp: In function 'int Base10(std::string)':
klasika.cpp:44:31: warning: unnecessary parentheses in declaration of 'i' [-Wparentheses]
   44 | #define rofa(i, a, b) for(int (i)=(a);(i)>=(b);(i)--)
      |                               ^
klasika.cpp:46:20: note: in expansion of macro 'rofa'
   46 | #define rof0(i, a) rofa((i),(a),0)
      |                    ^~~~
klasika.cpp:152:5: note: in expansion of macro 'rof0'
  152 |     rof0(i,(int)s.size()-1) {
      |     ^~~~
klasika.cpp: In function 'void dfs(int)':
klasika.cpp:40:31: warning: unnecessary parentheses in declaration of 'i' [-Wparentheses]
   40 | #define fora(i, a, b) for(int (i)=(a);(i)<(b);(i)++)
      |                               ^
klasika.cpp:42:20: note: in expansion of macro 'fora'
   42 | #define for0(i, b) fora((i),0,(b))
      |                    ^~~~
klasika.cpp:163:5: note: in expansion of macro 'for0'
  163 |     for0(i, (int) g[x].size()) {
      |     ^~~~
klasika.cpp: In function 'int main()':
klasika.cpp:40:31: warning: unnecessary parentheses in declaration of 'i' [-Wparentheses]
   40 | #define fora(i, a, b) for(int (i)=(a);(i)<(b);(i)++)
      |                               ^
klasika.cpp:42:20: note: in expansion of macro 'fora'
   42 | #define for0(i, b) fora((i),0,(b))
      |                    ^~~~
klasika.cpp:207:5: note: in expansion of macro 'for0'
  207 |     for0(i, n) {
      |     ^~~~
klasika.cpp:40:31: warning: unnecessary parentheses in declaration of 'q' [-Wparentheses]
   40 | #define fora(i, a, b) for(int (i)=(a);(i)<(b);(i)++)
      |                               ^
klasika.cpp:42:20: note: in expansion of macro 'fora'
   42 | #define for0(i, b) fora((i),0,(b))
      |                    ^~~~
klasika.cpp:224:5: note: in expansion of macro 'for0'
  224 |     for0(q, n) {
      |     ^~~~
# 결과 실행 시간 메모리 Grader output
1 Incorrect 3 ms 5196 KB Output isn't correct
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Incorrect 3 ms 5196 KB Output isn't correct
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Incorrect 925 ms 131560 KB Output isn't correct
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Incorrect 3 ms 5196 KB Output isn't correct
2 Halted 0 ms 0 KB -