Codeforces Round #715 (Div. 1) A

A. Binary Literature

我们观察发现 就是找两个串要是最长公共子序列大于等于n的
我们就一定可以构造出一个出来
但是传统的最长公共子序列是n2的
我们考虑一些特殊的性质 我们发现他只是一个01串
01串的匹配可以说是非常大
三个01串 一定可以找到两个的0或者1 有大于等于n个的0或者1
所以我们直接找到这么两个串 考虑构造
我们直接双指针指向两个串 找到可以重叠的0或1 然后只输出一个0或者1就可以了
但是细节比较多
比如我们要最后没找到了一定要及时break 要是break了 我们肯定会有一些串没有跑完 我们还是要加在后面的 还有就是要是长度不够再后面及时加一些数
代码较长主要是不想写函数

void solve(){
    int n;cin>>n;
    string s1,s2,s3;cin>>s1>>s2>>s3;
    int cnt1=0,cnt2=0,cnt3=0,cnt4=0,cnt5=0,cnt6=0;
    for(auto i:s1)(i=='1')?cnt1++:cnt2++;
    for(auto i:s2)(i=='1')?cnt3++:cnt4++;
    for(auto i:s3)(i=='1')?cnt5++:cnt6++;
    if(cnt1>=n&&cnt3>=n){
        string s;
        //1
        int i,j;
        for(i=0,j=0;i<n<<1&&j<n<<1;){
            while(s1[i]!='1'&&i<n<<1){
                s.push_back(s1[i]);
                i++;
            }
            while(s2[j]!='1'&&j<n<<1){
                s.push_back(s2[j]);
                j++;
            }
            if(i==n<<1||j==n<<1)break;
            s.push_back('1');
            i++,j++;
        }
        while(i<n<<1){s.push_back(s1[i]),i++;}
        while(j<n<<1){s.push_back(s2[j]),j++;}
        while(s.size()<n*3)s.push_back('1');
        cout<<s<<endl;
    }else if(cnt1>=n&&cnt5>=n){
        string s;
        //1
        int i,j;
        for(i=0,j=0;i<n<<1&&j<n<<1;){
            while(s1[i]!='1'&&i<n<<1){
                s.push_back(s1[i]);
                i++;
            }
            while(s3[j]!='1'&&j<n<<1){
                s.push_back(s3[j]);
                j++;
            }
            if(i==n<<1||j==n<<1)break;
            s.push_back('1');
            i++,j++;
        }
        while(i<n<<1){s.push_back(s1[i]),i++;}
        while(j<n<<1){s.push_back(s3[j]),j++;}
        while(s.size()<n*3)s.push_back('1');
        cout<<s<<endl;
    }else if(cnt3>=n&&cnt5>=n){
        string s;
        //1
        int i,j;
        for(i=0,j=0;i<n<<1&&j<n<<1;){
            while(s2[i]!='1'&&i<n<<1){
                s.push_back(s2[i]);
                i++;
            }
            while(s3[j]!='1'&&j<n<<1){
                s.push_back(s3[j]);
                j++;
            }
            if(i==n<<1||j==n<<1)break;
            s.push_back('1');
            i++,j++;
        }
        while(i<n<<1){s.push_back(s2[i]),i++;}
        while(j<n<<1){s.push_back(s3[j]),j++;}
        while(s.size()<n*3)s.push_back('0');
        cout<<s<<endl;
    }else if(cnt2>=n&&cnt4>=n){
        string s;
        //1
        int i,j;
        for(i=0,j=0;i<n<<1&&j<n<<1;){
            while(s1[i]!='0'&&i<n<<1){
                s.push_back(s1[i]);
                i++;
            }
            while(s2[j]!='0'&&j<n<<1){
                s.push_back(s2[j]);
                j++;
            }
            if(i==n<<1||j==n<<1)break;
            s.push_back('0');
            i++,j++;
        }
        while(i<n<<1){s.push_back(s1[i]),i++;}
        while(j<n<<1){s.push_back(s2[j]),j++;}
        while(s.size()<n*3)s.push_back('0');
        cout<<s<<endl;
    }else if(cnt2>=n&&cnt6>=n){
        string s;
        //1
        int i,j;
        for(i=0,j=0;i<n<<1&&j<n<<1;){
            while(s1[i]!='0'&&i<n<<1){
                s.push_back(s1[i]);
                i++;
            }
            while(s3[j]!='0'&&j<n<<1){
                s.push_back(s3[j]);
                j++;
            }
            if(i==n<<1||j==n<<1)break;
            s.push_back('0');
            i++,j++;
        }
        while(i<n<<1){s.push_back(s1[i]),i++;}
        while(j<n<<1){s.push_back(s3[j]),j++;}
        while(s.size()<n*3)s.push_back('0');
        cout<<s<<endl;
    }else if(cnt4>=n&&cnt6>=n){
        string s;
        //1
        int i,j;
        for(i=0,j=0;i<n<<1&&j<n<<1;){
            while(s2[i]!='0'&&i<n<<1){
                s.push_back(s2[i]);
                i++;
            }
            while(s3[j]!='0'&&j<n<<1){
                s.push_back(s3[j]);
                j++;
            }
            if(i==n<<1||j==n<<1)break;
            s.push_back('0');
            i++,j++;
        }
        while(i<n<<1){s.push_back(s2[i]),i++;}
        while(j<n<<1){s.push_back(s3[j]),j++;}
        while(s.size()<n*3)s.push_back('0');
        cout<<s<<endl;
    }
}
posted @ 2022-11-09 01:06  ycllz  阅读(19)  评论(0)    收藏  举报