hdu5536 Chip Factory(字典樹的插入刪除)

題目鏈接
在這裏插入圖片描述
思路:枚舉每個a【i】算貢獻,進行01字典樹取最大異或,但是由於i,j,k要不同,,所以在算a【i】的時候要把a【i】先從字典樹上刪除掉,不過哦貌似這題暴力也能過。

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn=2e3+5;
int tree[maxn*32][2],tot,ans=0,a[maxn],num[maxn*32];
void insert(int x)
{
    int u=0;
    for(int i=31;i>=0;--i)
    {
        int t=(((1LL<<i)&x)?1:0);
        if(!tree[u][t]) tree[u][t]=++tot;
        u=tree[u][t];
        num[u]++;
    }
}
void delet(int x)
{
    int u=0;
    for(int i=31;i>=0;--i)
    {
        int t=(((1LL<<i)&x)?1:0);
        u=tree[u][t];
        num[u]--;
    }
}
int query(int x)
{
    int u=0,res=0;
    for(int i=31;i>=0;--i)
    {
        int t=(((1LL<<i)&x)?1:0);
        if(tree[u][t^1]&&num[tree[u][t^1]]) u=tree[u][t^1],res+=(1LL<<i);
        else u=tree[u][t];
    }
    return res;
}
int main()
{
    int T,n;
    scanf("%d",&T);
    while(T--)
    {
        ans=tot=0;
        memset(tree,0,sizeof(tree));
        memset(num,0,sizeof(num));
        scanf("%d",&n);
        for(int i=1;i<=n;++i) scanf("%d",&a[i]),insert(a[i]);
        for(int i=1;i<=n;++i)
        {
            delet(a[i]);
            for(int j=i+1;j<=n;++j)
            {
                delet(a[j]);
                ans=max(ans,query(a[i]+a[j]));
                insert(a[j]);
            }
            insert(a[i]);
        }
        printf("%d\n",ans);
    }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章