The xor-longest Path - 01字典树

挺简单的一个入门题。只要清楚以下几点。
1,一段子串异或和等于两个前缀异或和的异或
2,01字典树的定义
3,会dfs即可
做到以上就没有什么思维难度和代码难度了。

#include "bits/stdc++.h"
using namespace std;
const int N = 1e5 + 5;
int head[N<<1];
long long  cnt = 0;
int ch[N * 32][2];
int val[N * 32];
struct node {
    
    
    int to, next, w;
} a[N<<1];
long long  cont = 1;

void build(int x) {
    
    
    int u = 0;
    for (int i = 32; i >= 0; --i) {
    
    
        int v = (x >> i) & 1;
        if (!ch[u][v]) {
    
    
            ch[cont][1] = ch[cont][0] = val[cont] = 0;
            ch[u][v] = cont++;
        }
        u = ch[u][v];
    }
    val[u] = x;
}


void add(int u, int v, int w) {
    
    
    a[++cnt].next = head[u];
    a[cnt].to = v;
    a[cnt].w = w;
    head[u] = cnt;
}

long long  sum[N];

void dfs(int u, int fa) {
    
    
    for (int i = head[u]; i; i = a[i].next) {
    
    
        int v = a[i].to;
        if (v == fa) continue;
        sum[v] = sum[u] ^ a[i].w;
        dfs(v, u);
    }
}


long long  query(int x) {
    
    
    int u = 0;
    for (int i = 32; i >= 0; --i) {
    
    
        int v = (x >> i) & 1;
        if (ch[u][v ^ 1]) u = ch[u][v ^ 1];
        else u = ch[u][v];
    }
    return val[u];
}

signed main() {
    
    
    int n;
    cnt = 1;
    ch[0][1] = ch[0][0] = 0;
    cin >> n;
    for (int i = 1; i <= n - 1; ++i) {
    
    
        int u, v, w;
        cin >> u >> v >> w;
        add(u, v, w);
        add(v, u, w);
    }
    dfs(0, -1);
    for (int i = 0; i < n; ++i) {
    
    
        build(sum[i]);
    }
    long long  ma = 0;
    for (int i = 0; i < n; ++i) {
    
    
        ma = max(ma, query(sum[i]) ^ sum[i]);
    }
    cout << ma << endl;
}

猜你喜欢

转载自blog.csdn.net/weixin_45509601/article/details/118944208