[codevs 1187]Xor最大路径 Trie+贪心

问题概括:求一棵带边权的树的一条最大Xor路径的值。

首先算出所有点到根路径的xor值并保存,这样任意两点路径的xor就可以用上述值互相xor表示(异或的基本性质)。

然后用所有值建一个Trie,位数强制31。对每个值在Trie上贪心即可,就是说尽量取反。

然而这题直接在Trie树上跑贪心会wa,而且大部分点都对了,不能理解。

#include
#include
#include
#include
using namespace std;
struct node{
    int to,sum,fa,val;
};
int num=0,vis[100010]={0},value[100010];
int maxans=0;
vector tree[100010];
void dfs(int fa,int sum){
    for(int i=0;i0){
            bit[k++]=s&1;            s>>=1;
        }
        for(int i=30;i>=0;i--){
            int c=bit[i];
            if(!ch[u][c]){
                memset(ch[sz],0,sizeof(ch[sz]));
                val[sz]=0;
                ch[u][c]=sz++;
            }
        u=ch[u][c];
        }
        val[u]=v;
    }
    void solve(){
        for(int i=0;i=0;j--){
                int bit=(tmp&(1<<(j)))>>j;
                if(ch[now][1-bit]>0){
                    ans=ans|((1-bit)<0){
                    ans=ans|(bit<maxans)maxans=(ans^tmp);
        }
    }
    void print(){
        for(int i=0;i


你可能感兴趣的:(位运算,贪心,Trie)