题目
题意: 给定长度为n的数组,判断能否找到两个不同的序列,满足序列的或相等。
思路: 乐,没想出来,看了题解才会。如果某个数x,起不到任何作用,就可以在某个序列的基础上或上x,结果还是原来的数。简而言之,如果某个数的每一位都出现过不止一次,就能找到。出现过不止一次,别的数也可以贡献此位。着实没想到。
代码:
#include<bits/stdc++.h>
using namespace std;
const int N = 1e5+10;
int n,m,k,T;
vector<int> va[N];
void solve()
{
cin>>n;
map<int,int> mp;
bool flag = 0;
for(int i=0;i<n;++i)
{
va[i].clear();
int num; cin>>num;
for(int j=0;j<num;++j)
{
int x; cin>>x;
mp[x]++;
va[i].push_back(x);
}
}
for(int i=0;i<n;++i)
{
bool ok = 1;
for(auto &item:va[i])
{
if(mp[item]==1)
{
ok = 0;
break;
}
}
if(ok) flag = 1;
}
if(flag) cout<<"Yes\n";
else cout<<"No\n";
}
signed main(void)
{
ios::sync_with_stdio(false),cin.tie(0),cout.tie(0);
cin>>T;
while(T--) solve();
return 0;
}