[POJ3764]The xor-longest Pat【Trie】

  • [POJ3764]The xor-longest Path

    题目大意:给出一棵有\(N\)个节点的树,树上每条边都有一个权值。从树中选择两个点\(x\)和\(y\),把\(x\)到\(y\)的路径上的所有边权\(xor\),求最大值(\(N\le {10}^5\))

    令\(d[x]\)为\(x\)到根的路径\(xor\),易得\(xor_{x->y}=d[x]\; xor\; d[y]\),问题就转化为求最大的\(d[x]\; xor\; d[y]\).按位贪心就好

int ch[Maxm][2], cnt;
void cal(int x){
    int now=0, p=0;
    for(int j=30; j >= 0; j--){
        int k=(x&(1<<j)) ? 0 : 1;
        if(ch[now][k]) now=ch[now][k], p+=1<<j;
        else if(ch[now][k^1]) now=ch[now][k^1];
        else break;
    }
    ans=max(ans, p);
}
void ins(int x){
    int now=0;
    for(int i=30, v; i >= 0; i--) v=(x&(1<<i)) ? 1 : 0, now=ch[now][v]=ch[now][v] ? ch[now][v] : ++cnt;
}
void dfs(int u, int fa){for(int i=head[u], v; i; i=nxt[i]) if((v=to[i]) != fa) d[v]=d[u]^w[i], dfs(v, u);}
void solve(){
    while(cin>>n){
        mem(head, 0); mem(nxt, 0); tot=0; mem(ch, 0); cnt=0; mem(d, 0); ans=0;
        for(int i=1, u, v, ww; i < n; i++)
            u=read()+1, v=read()+1, ww=read(), add(u, v, ww), add(v, u, ww);
        dfs(1, 0); for(int i=1; i <= n; i++) ins(d[i]);
        for(int i=1; i <= n; i++) cal(d[i]);
        printf("%d\n", ans);
    }
}

原文地址:https://www.cnblogs.com/zerolt/p/9295323.html

时间: 2024-10-06 00:54:05

[POJ3764]The xor-longest Pat【Trie】的相关文章

poj3764 The XOR Longest Path【dfs】【Trie树】

The xor-longest Path Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 10038   Accepted: 2040 Description In an edge-weighted tree, the xor-length of a path p is defined as the xor sum of the weights of edges on p: ⊕ is the xor operator. W

【Trie】The XOR Largest Pair

[题目链接] https://loj.ac/problem/10050 [题意] 给出n个数,其中取出两个数来,让其异或值最大. [题解] 经典的01字典树问题. 首先需要把01字典树建出来. 然后对于每一个串都跑一遍.如果存在当前位 不同的 节点,就往那里跑,否则顺着跑. 一切尽在代码中. [代码] 1 #include<bits/stdc++.h> 2 using namespace std; 3 typedef long long ll; 4 const int N = 1e5+10;

【Trie】【cogs647】有道搜索框

647. [Youdao2010] 有道搜索框 ★☆ 输入文件:youdao.in 输出文件:youdao.out 简单对比 时间限制:1 s 内存限制:128 MB [问题描述] 在有道搜索框中,当输入一个或者多个字符时,搜索框会出现一定数量的提示,如下图所示: 现在给你 N 个单词和一些查询,请输出提示结果,为了简这个问题,只需要输出以查询词为前缀的并且按字典序排列的最前面的 8 个单词,如果符合要求的单词一个也没有请只输出当前查询词. [输入文件] 第一行是一个正整数 N ,表示词表中有

【Trie】背单词

参考博客: https://www.luogu.org/problemnew/solution/P3294 https://blog.csdn.net/VictoryCzt/article/details/87186287 [题意] 题意如果看不懂,请到第二个链接去推一推事例,你就明白这个过程了. 来自题解中glf大佬的解析. 这题目描述真是令人窒息. 3个条件的意思大概是这样: (1).如果有单词作为现在正在填入的单词的后缀但并未填入,将花费n*n的代价. (2).如果没有单词作为当前填入单词

【Trie】The XOR-longest Path

[题目链接]: https://loj.ac/problem/10056 [题意] 请输出树上两个点的异或路径  的最大值. [题解] 这个题目,y总说过怎么做之后,简直就是醍醐灌顶了. 我们知道Xor路径,我们从根结点处理所有结点的  到根结点的异或和,我们想要两个点的异或路径. 其实就是利用根结点  到两个点  异或和 .因为LCA到根结点异或了两遍,所以答案就保留了异或路径的部分. 其实这个题目就是Xor——pair的变种. 处理从根结点出发的所有结点的位置的异或值. [代码] 1 #in

【Trie】Immediate Decodability

[题目链接]: https://loj.ac/problem/10052 [题意]: 就是给一些串,是否存在两个串是相同前缀的. [题解] 模板题,不想解释了. [代码]: 1 #include<cstdio> 2 #include<cstring> 3 #include<algorithm> 4 using namespace std ; 5 typedef long long ll; 6 const int N = 1e4; 7 int Son[N][2]; 8 c

USACO Longest Prefix 【水】

用Dp的思想解决了这道题目,也就是所谓的暴力= = 题意:给出一个集合,一个字符串,找出这个字符串的最长前缀,使得前缀可以划分为这个集合中的元素(集合中的元素可以不全部使用). 还不会Trie 树QAQ Source Code: /* ID: wushuai2 PROG: prefix LANG: C++ */ //#pragma comment(linker, "/STACK:16777216") //for c++ Compiler #include <stdio.h>

【Trie】bzoj1212 [HNOI2004]L语言

枚举每个文章里已经在Trie中被标记为可能是分割处的字符,然后再从此处跑Trie,继续向后标记.由于单词数很少,因此复杂度可以接受,O(n*m*Len). #include<cstdio> #include<cstring> using namespace std; int n,m,L; char s[1024*1024+100]; int ch[21*11][26]; bool is[21*11],end[1024*1024+100]; int sz; void Insert(c

【Trie】Trie字典树模板 静态指针池、数组写法

下面是数组写法: #include <cstdio> #include <string> #include <cstdlib> #include <cstring> #include <iostream> #include <algorithm> using namespace std; #define idx(x) x - 'a'; const int MAXN = 1e6; struct Trie { int next[26];