#include #include #include #include #include #include #include using namespace std; typedef pair< int, int > par; #define x first #define y second #define FORC(it, V) for(__typeof((V).begin()) it = (V).begin(); it != (V).end(); ++it) const int MAXW = 105; const int MAXT = 100005; const int P = 1000000007; int K, la, lb, lt; char a[MAXW], b[MAXW], t[MAXT]; int pw[MAXT], KEY[MAXW]; int A[MAXT][MAXW], B[MAXT][MAXW]; par C[MAXT], D[MAXT]; int dd[26][26]; void go( char *a, int l, int A[MAXT][MAXW] ) { for( int i = 0; i+l <= lt; ++i ) { int h = 0; for( int j = 0; j < l; ++j ) { A[i][j] = h; h = h*P + dd[ t[i+j]-'A' ][ a[j]-'A' ]; } A[i][l] = h; } } int f( int X, int LX, int Y, int LY ) { return ( X - Y*pw[LX-LY] )*pw[LY] + Y; } int gen( int K, int l, int A[MAXT][MAXW], par *C ) { int c = 0; for( int i = 0; i+l <= lt; ++i ) { C[i] = par( f( A[i][K], K, A[i][c], c ), i ); if( c == 0 ) c = K-1; else c--; } return lt-l+1; } int tmp[105]; int provjeri( par *C, int c, char *a, int l, int K ) { sort( C, C + c ); int g = 0; for( int i = 0; i < c; ++i ) { int p = C[i].y; for( int j = 0; j < K; ++j ) tmp[j] = dd[ t[p+j]-'A' ][ a[j]-'A' ]; int ok = 1; for( int j = K; j < l; ++j ) if( tmp[j%K] != dd[ t[p+j]-'A' ][ a[j]-'A' ] ) ok = 0; if( ok ) C[g++] = C[i]; } return g; } int cnt; void probaj( int A, int B, int K ) { if( A <= B && A+la > B ) return; if( B <= A && B+lb > A ) return; if( cnt ) { cnt = -1; return; } cnt = K; for( int j = 0; j < K; ++j ) KEY[j] = dd[ t[A+j]-'A' ][ a[j]-'A' ]; } int main(void) { pw[0] = 1; for( int i = 1; i < MAXT; ++i ) pw[i] = pw[i-1]*P; int K; for( int i = 0; i < 26; ++i ) for( int j = 0; j < 26; ++j ) { int c = ( i+j+1 )%26; dd[c][j] = i; } for( ;; ) { scanf( "%d", &K ); if( K == 0 ) break; scanf( "%s", a ); la = strlen( a ); scanf( "%s", b ); lb = strlen( b ); scanf( "%s", t ); lt = strlen( t ); go( a, la, A ), go( b, lb, B ); cnt = 0; for( int i = 0; i < K; ++i ) { int c = gen( i, la, A, C ); int d = gen( i, lb, B, D ); c = provjeri( C, c, a, la, i ); d = provjeri( D, d, b, lb, i ); int p = 0; for( int j = 0; j < c; ++j ) { while( p < d && D[p].x < C[j].x ) p++; if( p == d || D[p].x != C[j].x ) continue; int L = p; while( p < d && D[p].x == C[j].x ) p++; int R = p-1; int l = i, r = i; while( r < c && C[r].x == C[j].x ) r++; r--; probaj( L, l, i ), probaj( L, r, i ); probaj( R, r, i ), probaj( R, l, i ); j = r; } } if( cnt == 0 ) puts( "impossible" ); else if( cnt == -1 ) puts( "ambiguous" ); else { for( int i = 0; i < lt; ++i ) putchar( dd[ t[i]-'A' ][ KEY[i%cnt] ] + 'A' ); } } return 0; }