2 条题解

  • 0
    @ 2026-3-12 20:21:55
    #include <bits/stdc++.h>
    using namespace std;
    typedef long long ll;
    const int MAXK = 105;
    
    int k;
    ll a[MAXK];
    ll basis[65];  // 线性基
    
    bool insert(ll x) {
        for (int i = 63; i >= 0; i--) {
            if (!(x >> i)) continue;
            if (!basis[i]) {
                basis[i] = x;
                return true;
            }
            x ^= basis[i];
        }
        return false;
    }
    
    int main() {
        scanf("%d", &k);
        ll sum = 0;
        for (int i = 0; i < k; i++) {
            scanf("%lld", &a[i]);
            sum += a[i];
        }
        
        // 从大到小排序
        sort(a, a + k, greater<ll>());
        
        ll ans = 0;
        for (int i = 0; i < k; i++) {
            if (!insert(a[i])) {
                ans += a[i];  // 不能插入线性基,即可以拿走
            }
        }
        
        printf("%lld\n", ans);
        return 0;
    }
    
    • 0
      @ 2023-9-30 13:19:10

      未开发

      using namespace std;
      typedef long long ll;
      const int N = 110, len = 32;
      bool vis[N];
      ll a[N], b[N];
      int n;
      
      bool insert(ll x)	
      {
      	for(int j = len; j >= 0; --j)	
      	{
      		if((x & (1ll << j))== 0)
      			continue;
      		if(b[j])		
      			x ^= b[j];	
      		else{
      
      			for(int k = j - 1; k >= 0; --k)
      			{
      				if(x & (1ll << k))
      					x ^= b[k];
      			}
       
      			for(int k = len; k >= j + 1; --k)
      			{
      				if(b[k] & (1ll << j))
      					b[k] ^= x;
      			}
      			b[j] = x;	
      			return true;	
      		}						
      	}	
      	return false;
      }
      
      int main()
      {
      	scanf("%d", &n);
      	for(int i = 0; i < n; ++i)
      		scanf("%lld", &a[i]);
      	sort(a, a + n, greater<int>());
      	int cnt = 0;	
      	ll sum = 0;		
      	for(int i = 0; i < n; ++i)
      	{
      		if(insert(a[i]))
      			vis[i] = true, cnt++;
      		else
      			sum += a[i];
      	}
      	if(cnt == 1)
      		printf("-1\n");	
      	else
      		printf("%lld\n", sum);
      	return 0;
      }
      
      
      • 1

      信息

      ID
      140
      时间
      1000ms
      内存
      128MiB
      难度
      8
      标签
      递交数
      22
      已通过
      5
      上传者