一种分治的做法
查看原帖
一种分治的做法
131593
Woxuanyi楼主2024/10/18 02:17

不让我加题解了,主要是没学到trie树,没有想到这种做法,自己想了个分治的写法。

#include"bits/stdc++.h"
using namespace std;
int n,a[100010];
int solve(int l1,int r1,int l2,int r2) {
    if (l1>r1 || l2>r2) return 0;
    int t1=a[l1]^a[r1],t2=a[l2]^a[r2];
    while (t1!=(t1&-t1)) t1-=t1&-t1;
    while (t2!=(t2&-t2)) t2-=t2&-t2;
    if (t1==t2) {
        if (t1==0) {
            return a[l1]^a[l2];
        }
        int mid1=r1,mid2=r2;
        while (a[mid1]&t1) mid1--;
        while (a[mid2]&t2) mid2--;
        return max(solve(l1,mid1,mid2+1,r2),solve(mid1+1,r1,l2,mid2));
    }
    if (t1<t2) {
        int mid2=r2;
        while (a[mid2]&t2) mid2--;
        if ((a[l1]^a[l2])<(a[l1]^a[r2])) return solve(l1,r1,mid2+1,r2);
        else return solve(l1,r1,l2,mid2);

    } else {
        int mid1=r1;
        while (a[mid1]&t1) mid1--;
        if ((a[l2]^a[l1])<(a[l2]^a[r1])) return solve(mid1+1,r1,l2,r2);
        else return solve(l1,mid1,l2,r2);
    }
}

int main() {
    scanf("%d",&n);
    for (int i=1;i<=n;i++) {
        scanf("%d",a+i);
    }
    sort(a+1,a+n+1);
    int t=a[1]^a[n];
    while (t!=(t&-t)) t-=t&-t; //取出不同的最高位1
    int mid=n;
    while (a[mid]&t) mid--;
    printf("%d",solve(1,mid,mid+1,n));
    return 0;
}

思考了很久,还是比较独特的,理论复杂度也是O(32n),感觉不错

2024/10/18 02:17
加载中...