Minimieren der Sequenz

Gegeben ist eine Sequenz von n Zahlen , die Sie minimieren sollen. Um eine Sequenz lexikografisch zu minimieren, können zwei erlaubte Elemente der Sequenz miteinander vertauscht werden. Sie dürfen beliebig viele Vertauschungen vornehmen. Allerdings dürfen nur bestimmte Indizes miteinander getauscht werden, während andere nicht erlaubt sind.

Lexikografischer Vergleich zweier Sequenzen

Eine Sequenz ist genau dann lexikografisch kleiner als eine Sequenz , wenn es ein k (1 ≤ k ≤ n) gibt, sodass , , …, und . Anders ausgedrückt gibt es einen Index k, bei dem gilt, während alle vorhergehenden Elemente gleich sind.

Anhand der Matrix der erlaubten Vertauschungen sollen Sie die lexikografisch kleinstmögliche Sequenz ermitteln, die sich aus der Anfangssequenz ableiten lässt.

Eingabe

Die erste Zeile der Eingabe enthält eine einzelne ganze Zahl n (1 ≤ n ≤ 300).

In der nächsten Zeile befinden sich n durch Leerzeichen getrennte ganze Zahlen (1 ≤ ≤ n), die die Anfangssequenz repräsentieren. Dabei sind alle Zahlen unterschiedlich.

Die folgenden n Zeilen enthalten n Nullen und Einsen, die angeben, ob ein Tausch zwischen zwei Indizes erlaubt ist. Steht an Zeile i und Spalte j eine 1, so bedeutet das, dass der Tausch der Elemente an Position i und j erlaubt ist. Steht dort eine 0, ist ein Tausch nicht erlaubt.

Ausgabe

Das Programm soll die lexikografisch kleinstmögliche Sequenz ausgeben, die sich aus der gegebenen Anfangssequenz ableiten lässt.

Beispiele

Eingabe

Ausgabe

5
4 2 1 5 3
00100
00011
10010
01101
01010

1 2 3 4 5

7
5 2 4 3 6 7 1
0001001
0000000
0000010
1000001
0000000
0010000
1001000

1 2 4 3 6 7 5

Erklärung

  1. Wir können folgende Vertauschungen durchführen:

    1. ↔  ⇒ 1 2 4 5 3

    2. ↔  ⇒ 1 2 4 3 5

    3. ↔  ⇒ 1 2 3 4 5

  2. ⇒ 1 2 4 5 3

Constraints

Time limit: 2 seconds

Memory limit: 512 MB

Output limit: 1 MB

To check your solution you need to sign in
Sign in to continue