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;
}
}
标签:string,cnt6,int,715,Codeforces,++,cnt5,&&,Div
From: https://www.cnblogs.com/ycllz/p/16871844.html