#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>
// g++ ...
#define __STDC_FORMAT_MACROS
#include <inttypes.h>
int main()
{
int maara;
int *uolevi, *maija, *kaaleppi, *vaihto;
int virhe = 0;
if(fscanf(stdin, "%d", &maara) > 0)
{
uolevi = (int*)malloc(maara * sizeof(int));
for(i = 0; i < maara; ++i)
if(fscanf(stdin, "%d", &uolevi[i]) < 0)
break;
maija = (int*)malloc(maara * sizeof(int));
for(i = 0; i < maara; ++i)
if(fscanf(stdin, "%d", &maija[i]) < 0)
break;
kaaleppi = (int*)malloc(maara * sizeof(int));
vaihto = (int*)malloc(maara * sizeof(int));
} else
virhe = 1;
if(!virhe)
{
int i, j;
// kierrätä uolevin kirjajoukkoa, tallenna käyttämättä
// jääneet epäsopivat luvut
for(i = 0, j = 1; i < maara - (j - 1); ++i)
{
kaaleppi[i] = uolevi[(i + j) % maara];
if(kaaleppi[i] == maija[i])
{
virhe = 1;
vaihto[j - 1] = kaaleppi[i];
--i;
++j;
}
}
if(virhe)
{
int k, l, m, n;
int *kohdat = (int*)malloc(maara * sizeof(int));
// kierrätä käyttämättä jääneiden lukujen joukkoa
for(k = 0, l = 0; k < j - 1; ++k)
{
kaaleppi[i + k] = vaihto[(k + l) % j];
if(kaaleppi[i + k] == maija[i + k])
{
k = 0;
++l;
}
}
// jos vielä virheitä, vaihda näissä kohdissa olevien lukujen
// paikkoja keskenään, kunnes ratkaisu löytyy
uudestaan:
for(i = 0, m = 0; i < maara; ++i)
{
if(kaaleppi[i] == uolevi[i] || kaaleppi[i] == maija[i])
{
kohdat[m] = i;
++m;
}
}
if(m == 0)
goto valmis;
for(i = 0, n = 0; i < m + 1; ++i)
kaaleppi[kohdat[i]] = kaaleppi[kohdat[(i + n) % (m + 1)]];
goto uudestaan;
valmis:
virhe = 0;
}
for(i = 0; i < maara; ++i)
printf("%u ", kaaleppi[i]);
free(uolevi);
free(maija);
free(kaaleppi);
free(vaihto);
}
return virhe;
}