Forgotten Spell (想法题,三个相同字符串的修改)

原题:Gym - 101755M

题意:

有三个原本相同的字符串,每个字符串最多被改一个字母,求原来的字符串

解析:

3个相同不相同的情况只有三种:都相同,两个相同(记作x),都不同(记作y)

而都相同就可以不用管了,我们记录一下有多少个位置都不同(记录位置),或者两个相同(记录位置,哪个不同)

两个相同:改一个或者两个
三个不同:改两个

  • x=1,y=0 或 x=0,y=1 或 x=0,y=0 那么可以随便改了
  • x=1,y=1时,说明三个不同的位置改两个,两个相同的改一个,所以改的是两个相同的以外的那个,三个不同的位置改其他两个
  • y>1时,不可能
  • x=2时,如果是相同的串和其他不同(ac,bd,bd)那么可以改成(bc,bc,bc或ad,ad,ad),如果不同的串的话(ac,bd,ad)就只能改成(ad,ad,ad)
  • x=3时,只有不同的三个字母在三个不同的串才行
  • x>3时,不可能

代码:


struct node{
    int p,idx;
    node(int p,int idx):p(p),idx(idx){}
};

int main(){
    string x[3];cin>>x[0]>>x[1]>>x[2];
    queue<node>_3,_2;//3个都不同 2个相同
    for(int i=0;i<x[0].length();i++){
        if(x[0][i]==x[1][i]&&x[0][i]==x[2][i])continue;
        if(x[0][i]!=x[1][i]&&x[0][i]!=x[2][i]&&x[2][i]!=x[1][i])_3.push(node(i,0));
        else if(x[0][i]==x[1][i])_2.push(node(i,2));
        else if(x[0][i]==x[2][i])_2.push(node(i,1));
        else if(x[2][i]==x[1][i])_2.push(node(i,0));
        if(2*_3.size()+_2.size()>3)return 0*printf("Impossible\n");
    }
    if(_3.size()==1&&_2.size()==1){
        int a=_2.front().idx,p=_3.front().p;
        for(int i=0;i<3;i++){
            x[i][p]=x[a][p];
        }
        p=_2.front().p;
        for(int i=0;i<3;i++){
            if(i!=a)x[a][p]=x[i][p];
        }
        cout<<x[0]<<endl;return 0;
    }
    if(_3.size()+_2.size()<=1)return 0*printf("Ambiguous\n");
    if(_2.size()==2){
        int a1=_2.front().idx,p1=_2.front().p;
        _2.pop();
        int a2=_2.front().idx,p2=_2.front().p;
        if(a1==a2)return 0*printf("Ambiguous\n");
        for(int i=0;i<3;i++){
            if(i!=a1)x[a1][p1]=x[i][p1];
        }
        for(int i=0;i<3;i++){
            if(i!=a2)x[a2][p2]=x[i][p2];
        }
        cout<<x[0]<<endl;return 0;
    }
    if(_2.size()==3){
        int a[3];
        for(int i=0;i<3;i++){
            a[i]=_2.front().idx;int p=_2.front().p;
            for(int j=0;j<3;j++){
                if(j!=a[i])x[a[i]][p]=x[j][p];
            }
            _2.pop();
        }
        if(a[0]!=a[1]&&a[1]!=a[2]&&a[0]!=a[2])cout<<x[0]<<endl;
        else return 0*printf("Impossible\n");
    }
}

猜你喜欢

转载自blog.csdn.net/jk_chen_acmer/article/details/81226892