User ainta has a permutation p 1, p 2, …, p n. As the New Year is coming, he wants to make his permutation as pretty as possible.
Permutation a 1, a 2, …, a n is prettier than permutation b 1, b 2, …, b n, if and only if there exists an integer k (1 ≤ k ≤ n) where a 1 = b 1, a 2 = b 2, …, a k - 1 = b k - 1 and a k < b k all holds.
As known, permutation p is so sensitive that it could be only modified by swapping two distinct elements. But swapping two elements is harder than you think. Given an n × n binary matrix A, user ainta can swap the values of p i and p j (1 ≤ i, j ≤ n, i ≠ j) if and only if A i, j = 1.
Given the permutation p and the matrix A, user ainta wants to know the prettiest permutation that he can obtain.
Input
The first line contains an integer n (1 ≤ n ≤ 300) — the size of the permutation p.
The second line contains n space-separated integers p 1, p 2, …, p n — the permutation p that user ainta has. Each integer between 1 and n occurs exactly once in the given permutation.
Next n lines describe the matrix A. The i-th line contains n characters ‘0’ or ‘1’ and describes the i-th row of A. The j-th character of the i-th line A i, j is the element on the intersection of the i-th row and the j-th column of A. It is guaranteed that, for all integers i, j where 1 ≤ i < j ≤ n, A i, j = A j, i holds. Also, for all integers i where 1 ≤ i ≤ n, A i, i = 0 holds.
Output
In the first and only line, print n space-separated integers, describing the prettiest permutation that can be obtained.
Examples
input
7
5 2 4 3 6 7 1
0001001
0000000
0000010
1000001
0000000
0010000
1001000
output
1 2 4 3 6 7 5
input
5
4 2 1 5 3
00100
00011
10010
01101
01010
output
1 2 3 4 5
Note
In the first sample, the swap needed to obtain the prettiest permutation is: (p 1, p 7).
In the second sample, the swaps needed to obtain the prettiest permutation is (p 1, p 3), (p 4, p 5), (p 3, p 4).

A permutation p is a sequence of integers p 1, p 2, …, p n, consisting of n distinct positive integers, each of them doesn’t exceed n. The i-th element of the permutation p is denoted as p i. The size of the permutation p is denoted as n.
Solution:
#include <cstring>
#include <vector>
#include <list>
#include <map>
#include <set>
#include <deque>
#include <stack>
#include <bitset>
#include <algorithm>
#include <functional>
#include <numeric>
#include <utility>
#include <sstream>
#include <iostream>
#include <iomanip>
#include <cstdio>
#include <cmath>
#include <cstdlib>
#include <ctime>
#include <memory.h>
#include <cassert>
using namespace std;
const int N = 777;
char s[N][N];
int value[N];
int a[N];
bool was[N];
int x[N];
int main() {
int n;
scanf("%d", &n);
for (int i = 0; i < n; i++) {
scanf("%d", a + i);
}
for (int i = 0; i < n; i++) {
scanf("%s", s[i]);
}
for (int i = 0; i < n; i++) {
was[i] = false;
}
for (int i = 0; i < n; i++) {
if (was[i]) {
continue;
}
int b = 0, e = 0;
x[0] = i;
was[i] = true;
while (b <= e) {
for (int j = 0; j < n; j++) {
if (!was[j] && s[x[b]][j] == '1') {
e++;
x[e] = j;
was[j] = true;
}
}
b++;
}
for (int pos = 0; pos <= e; pos++) {
value[pos] = a[x[pos]];
}
sort(x, x + e + 1);
sort(value, value + e + 1);
for (int pos = 0; pos <= e; pos++) {
a[x[pos]] = value[pos];
}
}
for (int i = 0; i < n - 1; i++) {
printf("%d ", a[i]);
}
printf("%d\n", a[n - 1]);
return 0;
}