可持久化trie可行吗?

RT

我dfs序+可持久化trie写炸了,但我想应该可以这么做。

写炸的代码

#include <bits/stdc++.h>
#define N 100005
using namespace std;

int n, a[N];
int head[N], to[N], nxt[N], top = 1;
int trie[N * 17][2], ed[N * 17], sum[N * 17], root[N], cnt = 2;
int L[N], R[N], maxx[N], tim;

void inedge(int u, int v) {
    to[top] = v;
    nxt[top] = head[u];
    head[u] = top++;
}

int intrie(int x, int id) {
    int now = root[id] = ++cnt;
    int pre = root[id - 1];
    for(int i = 17;~i;i--) {
        int ch = (x & (1 << i)) ? 1 : 0;
        trie[now][0] = trie[pre][0];
        trie[now][1] = trie[pre][1];
        sum[now] = sum[pre] + 1;
        trie[now][ch] = cnt++;
        now = trie[now][ch];
        pre = trie[pre][ch];
    }
    ed[now] = id;
}

int find(int pt, int nt, int v) {
    for(int i = 17;~i;i--) {
        int ch = (v & (1 << i)) ? 1 : 0;
        if(sum[trie[nt][ch ^ 1]] - sum[trie[pt][ch ^ 1]]) {
            nt = trie[nt][ch ^ 1];
            pt = trie[pt][ch ^ 1];
        } else {
            nt = trie[nt][ch];
            pt = trie[pt][ch];
        }
    }
    return ed[nt];
}

int dfs(int x) {
    int ls;
    intrie(maxx[x] = a[x], L[x] = ++tim);
    for(int i = head[x];i;i = nxt[i])
        if((ls = dfs(to[i])) > maxx[x])
            maxx[x] = ls;
    R[x] = tim;
    return maxx[x];
}

void init() {
    scanf("%d", &n);
    int u, v;
    for(int i = 1;i < n;i++) {
        scanf("%d%d", &u, &v);
        inedge(u, v);
    }
    for(int i = 1;i <= n;i++)
        scanf("%d", a + i);
    dfs(1);
}

void work() {
    int m, p;
    scanf("%d", &m);
    while(m--) {
        scanf("%d", &p);
        int ans = maxx[p], pre = 0;
        while(ans > pre) {
            pre = ans;
            ans ^= a[find(root[L[p] - 1], root[R[p]], pre)];
        }
        printf("%d\n", pre);
    }
}

int main() {
    init();
    work();
    return 0;
}

爆0可还行,我要死了QAQ

全部评论
可持久化Trie树你不是只能找一个数吗,你怎么实现子树?
点赞 回复 分享
发布于 2019-08-22 14:08

相关推荐

蚂蚁 基架java (n+6)*16 签字费若干
点赞 评论 收藏
分享
评论
点赞
收藏
分享
牛客网
牛客企业服务