题解:CF193C Hamming Distance
Aurelia_Veil · · 题解
题解:CF193C Hamming Distance
考试考到这道题思路想对了,思路想错了。
注:本题解使用 AI 进行笔误检查和学术问题检查,保证本人功劳为 AI 的五倍及以上。
题就不读了,较为简洁。
我们发现这 4 个字符串的每一个相同位都与其他的位没有关联,于是我们可以采取切片处理,将这四个字符串的切片单独进行计算。
我们设第一个字符串全部为
注:我们用
| 计数 | 组合 |
s2 | s3 | s4 | 对汉明距离的贡献(都是加 |
|---|---|---|---|---|---|
| 无贡献(所有距离加 |
|||||
于是可以列出方程:
将方程两两组合消元,得:
我们发现六个方程有七个未知数,所以其中一个为自由变量,我们选择
我们开始推导出
显而易得,
方程列出来了,我们就来寻找一下条件来判断是否有解。因为
因为
我们最后按顺序将切片一次读入四个字符串中(具体参考表格),输出即可,代码如下(vjudge 远程通过记录):
#include<bits/stdc++.h>
using namespace std;
#define int long long
int p[8];
signed main(){
for(int i=1;i<=6;i++){
scanf("%lld",&p[i]);
}
int s1=p[1]+p[2]-p[4];
int s2=p[1]+p[3]-p[5];
int s3=p[2]+p[3]-p[6];
int k1=p[1]+p[2]-p[5]-p[6];
int k2=p[1]+p[3]-p[4]-p[6];
int k3=p[2]+p[3]-p[4]-p[5];
if(s1<0||s2<0||s3<0||s1&1||s2&1||s3&1){
printf("-1");
return 0;
}
if(k1&1||k2&1||k3&1){
printf("-1");
return 0;
}
int p1=(p[1]+p[2]-p[4])/2;
int p2=(p[1]+p[3]-p[5])/2;
int p3=(p[2]+p[3]-p[6])/2;
int pulow=max({0ll,k1/2,k2/2,k3/2});
int puhigh=min({p1,p2,p3});
if(pulow>puhigh){
printf("-1");
return 0;
}
int t7=pulow;
int t3=p3-t7;
int t5=p2-t7;
int t6=p1-t7;
int t1=t7-k1/2;
int t2=t7-k2/2;
int t4=t7-k3/2;
int len=t1+t2+t3+t4+t5+t6+t7;
printf("%lld\n",len);
string a="",b="",c="",d="";
for(int i=1;i<=len;i++){
a+="a";
}
for(int i=1;i<=t1+t2+t3;i++){
b+="a";
}
for(int i=1;i<=t4+t5+t6+t7;i++){
b+="b";
}
for(int i=1;i<=t1;i++){
c+="a";
}
for(int i=1;i<=t2+t3;i++){
c+="b";
}
for(int i=1;i<=t4+t5;i++){
c+="a";
}
for(int i=1;i<=t6+t7;i++){
c+="b";
}
for(int i=1;i<=t1;i++){
d+="b";
}
for(int i=1;i<=t2;i++){
d+="a";
}
for(int i=1;i<=t3;i++){
d+="b";
}
for(int i=1;i<=t4;i++){
d+="a";
}
for(int i=1;i<=t5;i++){
d+="b";
}
for(int i=1;i<=t6;i++){
d+="a";
}
for(int i=1;i<=t7;i++){
d+="b";
}
cout<<a<<"\n"<<b<<"\n"<<c<<"\n"<<d;
return 0;
}
完结撒花!!!