CF 245D Restoring Table

D - Restoring Table
Time Limit:2000MS    Memory Limit:262144KB    64bit IO Format:%I64d & %I64u

Description

Recently Polycarpus has learned the "bitwise AND" operation (which is also called "AND") of non-negative integers. Now he wants to demonstrate the school IT teacher his superb manipulation with the learned operation.

For that Polycarpus came to school a little earlier and wrote on the board a sequence of non-negative integers a1, a2, ..., an. He also wrote a square matrix b of size n × n. The element of matrix b that sits in the i-th row in the j-th column (we'll denote it as bij) equals:

  • the "bitwise AND" of numbers ai and aj (that is, bij = ai & aj), if i ≠ j;
  • -1, if i = j.

Having written out matrix b, Polycarpus got very happy and wiped a off the blackboard. But the thing is, the teacher will want this sequence to check whether Polycarpus' calculations were correct. Polycarus urgently needs to restore the removed sequence of integers, or else he won't prove that he can count correctly.

Help Polycarpus, given matrix b, restore the sequence of numbers a1, a2, ..., an, that he has removed from the board. Polycarpus doesn't like large numbers, so any number in the restored sequence mustn't exceed 109.

Input

The first line contains a single integer n (1 ≤ n ≤ 100) — the size of square matrix b. Next n lines contain matrix b. The i-th of these lines contains n space-separated integers: the j-th number represents the element of matrix bij. It is guaranteed, that for all i (1 ≤ i ≤ n) the following condition fulfills: bii = -1. It is guaranteed that for all i, j (1 ≤ i, j ≤ ni ≠ j) the following condition fulfills: 0 ≤ bij ≤ 109, bij = bji.

Output

Print n non-negative integers a1, a2, ..., an (0 ≤ ai ≤ 109) — the sequence that Polycarpus wiped off the board. Separate the numbers by whitespaces.

It is guaranteed that there is sequence a that satisfies the problem conditions. If there are multiple such sequences, you are allowed to print any of them.

Sample Input

Input
1
-1
Output
0 
Input
3
-1 18 0
18 -1 0
0 0 -1
Output
18 18 0 
Input
4
-1 128 128 128
128 -1 148 160
128 148 -1 128
128 160 128 -1
Output
128 180 148 160 

Hint

If you do not know what is the "bitwise AND" operation please read: http://en.wikipedia.org/wiki/Bitwise_operation.


题目大意:

让你构造一个序列a1, a2, a3....an,使其满住矩阵 bij = ai & aj; (i != j) bij = -1 (i == j)


-1 就不用管了,矩阵自身就满足,关键是根据矩阵求出序列。

先求序列的第一个数,第一个数只与第一行和第一列有关,由于对称性,我们只考虑行。

怎样才能构造出a1,试想 & 有什么性质,只有两个数二进制表示相同位全为1时这一位才为1.相当与有一个数 a & (一堆其他的数)= 矩阵第一行(i != j)这不是明摆着矩阵第一行

的每一个数,这个数的二进制表示如果在某位上是1,a在这一位也比需是1,且要满足这一行的所有的数,相当与 这一行 b11 | b12 | b13 | b14 ....... | b1n = a;


依次求出后输出。


#include <iostream>
#include <string.h>
#include <string>
#include <algorithm>
#include <cmath>
#include <stack>
#include <cstdio>
#include <queue>
#include <cstdlib>
#define INF 99999999
#define MAXN 105

using namespace std;

int c[MAXN][MAXN];
int array[MAXN];

void input()
{
    int n;

    cin >> n;

    for (int i = 0; i < n; i++)
    {
        int sum = 0;
        
        for (int j = 0; j < n; j++)
        {
            scanf("%d", &c[i][j]);
            
            if (i == j)
            {
                continue;
            }

            sum |= c[i][j];
        }
        array[i] = sum;
    }


    for (int i = 0; i < n; i++)
    {
        cout << array[i];
        
        if (i != n - 1)
        {
            cout << ' ';
        }
    }
    cout << endl;
}

int main()
{
    input();
    return 0;
}




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值