2021春季个人赛-3 补题

D.XOR Permutations

题意: 给定3个长度为10只由01构成的字符串,你可以任意移动01的位置,使得他们最后异或和最大。
分析: 统计3个字符串的01个数。当遇到"001"和“111”的情况就输出1,否则输出0。每次需要排序。

代码:

#include<bits/stdc++.h>
using namespace std;
const int N=15;
int t;
char a[N],b[N],c[N];
int main(){
    
    
    cin>>t;
    while(t--){
    
    
        int a1=0,a0=0,b1=0,b0=0,c1=0,c0=0;
        cin>>a>>b>>c;
        for(int i=0;i<10;i++){
    
    
            if(a[i]=='1') a1++;
            else a0++;
        }
        for(int i=0;i<10;i++){
    
    
            if(b[i]=='1') b1++;
            else b0++;
        }
        for(int i=0;i<10;i++){
    
    
            if(c[i]=='1') c1++;
            else c0++;
        }
        for(int i=0;i<10;i++){
    
    
            if(a1<b1){
    
    
                swap(a1,b1);
                swap(a0,b0);
            }
            if(b1<c1){
    
    
                swap(b1,c1);
                swap(b0,c0);
            }
            if(a1<b1){
    
    
                swap(a1,b1);
                swap(a0,b0);
            }
            if(a1&&b0&&c0){
    
    
                a1--,b0--,c0--;
                cout<<"1";
            }
            else if(a1&&b1&&c1){
    
    
                a1--,b1--,c1--;
                cout<<"1";
            }
            else cout<<"0";
        }
        cout<<endl;
    }
}

K.Subarrays OR

题意: 统计数组所有区间的所有或运算的和的个数
分析: 暴力+set优化

代码:

#include<bits/stdc++.h>
using namespace std;
int t,n,a;
int main(){
    
    
    cin>>t;
    while(t--){
    
    
        set<int> s,res;
        cin>>n;
        for(int i=0;i<n;i++){
    
    
            set<int> now;
            cin>>a;
            for(auto i:s){
    
    
                res.insert(i|a);
                now.insert(i|a);
            }
            now.insert(a);
            res.insert(a);
            s=now;
        }
        cout<<res.size()<<endl;
    }
}

猜你喜欢

转载自blog.csdn.net/messywind/article/details/114659277