【题目】http://codeforces.com/problemset/problem/814/B
【题意】a、b串中最多有两处不同,构造c串,使得c恰好由1-n每个数出现一次构成。
【代码】
#include<bits/stdc++.h>
using namespace std;
int a[1205],b[1205];
int bk1[1205]= {0},bk2[1205]= {0};
int main()
{
int n;
cin>>n;
for(int i=0; i<n; i++)
{
cin>>a[i];
bk1[a[i]]++;
}
for(int i=0; i<n; i++)
{
cin>>b[i];
bk2[b[i]]++;
}
int t1,t2=-1,fl=0;
for(int i=0; i<n; i++)
{
if(a[i]!=b[i]&&!fl)
{
t1=i;
fl=1;
}
else if(a[i]!=b[i]&&fl)
{
t2=i;
}
}
//cout<<t1<<t2;
int c[1205];
if(t2==-1)//如果只有一个数不同
{
int pp;
for(int i=0; i<n; i++)
{
c[i]=a[i];
if(bk1[i]==0&&bk2[i]==0)
//只有一个数不同那么一定有一个数在a、b中都没有出现过
pp=i;
}
c[t1]=pp;//将没有出现过的数
}
else
{
for(int i=0; i<n; i++)
{
if(i!=t1&&i!=t2)//a、b中相同的地方直接给c
{
c[i]=a[i];
}
else if(i==t1)//找到第一个不同处
{
if(bk1[a[i]]>1)//如果a这个位置的数出现不止1次
{
if(bk1[b[i]]&&bk2[b[i]])//若b这个位置的数在a、b都有出现
{
c[i]=a[i];//a->t1,b->t2
c[t2]=b[t2];
}
else
{
c[i]=b[i];//b->t1,a->t2
c[t2]=a[t2];
}
}
else
{
if(bk1[a[i]]&&bk2[a[i]])
{
c[i]=b[i];//b->t1,a->t2
c[t2]=a[t2];
}
else
{
c[i]=a[i];//a->t1,b->t2
c[t2]=b[t2];
}
}
}
}
}
int bk[1205]= {0};
for(int i=0; i<n; i++)
{
bk[c[i]]++;
}
int p=-1;
for(int i=1; i<=n; i++)
{
if(bk[i]==0)//c中哪个数还未出现过
p=i;
}
if(p!=-1)
{
for(int i=0; i<n; i++)
{
if(c[i]==0)//将是0的那个数赋为p
c[i]=p;
}
}
for(int i=0; i<n; i++)
{
cout<<c[i]<<" ";
}
}