使用trie进行XOR最大化

时间:2015-05-29 18:00:44

标签: c arrays xor trie maximization

我正试图解决这个问题 -

  • 给定无符号32位整数的数组A,选择两个入边索引i,j,以便最大化A [i] ^ A [j]的值,其中^是按位异或(独家OR)运营商。

    • 示例输入:

    • 4 2 0 13 49

    • 输出:

    • 60

  • 说明:13 ^ 49是60

这是我的代码

#include <stdio.h>

void insert(int n, int pos, struct node *t);
int find(struct node *p1, struct node *p2);
struct node *alloc();    
struct node{
    int value;
    struct node *left;
    struct node *right;
};
int main()
{

    int t;
    scanf("%d", &t);
    while (t--)
    {
        int n;
        scanf("%d", &n);
        struct node root;
        root.value = 0;
        root.left = root.right = NULL;
        while (n--)
        {
            int num;
            scanf("%d", &num);
            insert(num, 31 , &root);

        }

        int max = find(&root, &root);
        printf("%d\n", max);

    }
    return 0;
}
void insert(int n, int pos, struct node *t)
{
    if (pos >= 0)
    {
        struct node  *m;
        int bit = (1 << pos)&n;
        if (bit)
        {


            if (t->right == NULL)
            {
                m=alloc();
                m->value = 1;
                m->left = NULL;
                m->right = NULL;
                t->right = m;
            }


            if (pos == 0)
            {
                m=alloc();
                m->value = n;
                m->left = NULL;
                m->right = NULL;
                t->left = m;
            }


            insert(n, pos - 1, t->right);
        }
        else
        {


            if (t->left == NULL)
            {
                m = alloc();
                m->value = 0;
                m->left = NULL;
                m->right = NULL;
                t->left = m;
            }


            if (pos == 0)
            {
                m=alloc();
                m->value = n;
                m->left = NULL;
                m->right = NULL;
                t->left = m;
            }

            insert(n, pos - 1, t->left);
        }
    }
}
int find(struct node *p1, struct node *p2)
{


    if ((p1->left != NULL) ||(p1->right != NULL))
    {
        int n01 = 0;
        int n10 = 0;
        if (p1->left != NULL && p2->right != NULL)
        {
            n01 = find(p1->left, p2->right);
        }
        if ((p1->right != NULL) && (p2->left != NULL))
        {
            n10 = find(p2->left, p1->right);
        }
        else
        {
            if (p1->left!=NULL && p2->left!=NULL)
                n01 = find(p1->left, p2->left);
            else
                n10 = find(p1->right, p2->right);
        }
        return (n01 > n10 ? n01 : n10);
    }
    else
    {
        return p1->value^p2->value;
    }
}
struct node *alloc()
{
    return (struct node *) malloc(sizeof(struct node));
}

我只输出0作为输出。我知道我的代码中有错误。请帮助我找出错误或必要时找到正确的解决方案。

0 个答案:

没有答案