Codeforce 985B 思维题开关灯问题

B. Switches and Lamps

time limit per test

3 seconds

memory limit per test

256 megabytes

input

standard input

output

standard output

You are given n switches and m lamps. The i-th switch turns on some subset of the lamps. This information is given as the matrix aconsisting of n rows and m columns where ai, j = 1 if the i-th switch turns on the j-th lamp and ai, j = 0 if the i-th switch is not connected to the j-th lamp.

Initially all m lamps are turned off.

Switches change state only from "off" to "on". It means that if you press two or more switches connected to the same lamp then the lamp will be turned on after any of this switches is pressed and will remain its state even if any switch connected to this lamp is pressed afterwards.

It is guaranteed that if you push all n switches then all m lamps will be turned on.

Your think that you have too many switches and you would like to ignore one of them.

Your task is to say if there exists such a switch that if you will ignore (not use) it but press all the other n - 1 switches then all the m lamps will be turned on.

Input

The first line of the input contains two integers n and m (1 ≤ n, m ≤ 2000) — the number of the switches and the number of the lamps.

The following n lines contain m characters each. The character ai, j is equal to '1' if the i-th switch turns on the j-th lamp and '0' otherwise.

It is guaranteed that if you press all n switches all m lamps will be turned on.

Output

Print "YES" if there is a switch that if you will ignore it and press all the other n - 1 switches then all m lamps will be turned on. Print "NO" if there is no such switch.

Examples

input

Copy

4 5
10101
01000
00111
10000

output

Copy

YES

input

Copy

4 5
10100
01000
00110
00101

output

Copy

NO

题意:给n盏灯,m个开关,每次按开关只能将灯从灯灭的状态转变为灯亮,问是否存在不按所有开关就将所有灯打开的方法。

 

思路:最暴力的方法就是每层都去掉一次,然后再暴力每一列,这样的复杂度为O(n^3),显然是过不了的,然后另辟蹊径:

可以开一个一维数组存放每一列,也就是每一盏灯被多少开关控制的数目,然后再去枚举每一行,也就是每一个开关控制的灯,如果说e[i][j]==1&&cnt[j]==1,就是说第i个开关是控制第j盏灯,并且这一盏灯只有一个开关i控制,因此这一个开关是不能去掉的,那就遍历下一个开关,以此类推……

#include
using namespace std;
#define rep(i,a,b) for(int i=a;i<=b;i++)
int e[2005][2005];
int cnt[2005];
int main()
{
    int n, m;
    scanf("%d%d",&n,&m);
    rep(i,1,n)
    rep(j,1,m){
   scanf("%1d",&e[i][j]);if(e[i][j]==1) cnt[j]++;}
   int f=0;
   rep(i,1,n)
   {
       f=0;
       rep(j,1,m)
       if(e[i][j]==1&&cnt[j]==1)
       {
           f=1;break;
       }
       if(!f) {
        printf("YES\n");return 0;
       }
   }
   printf("NO\n");
    return 0;
}

 

你可能感兴趣的:(思维)