B. 代码查重
Time limit per test: 2.0 seconds
Memory limit: 256 megabytes
一场 EOJ 月赛中在小迷妹们的合作之下她们 AC 了所有题目。
拥有 EOJ 管理员权限的 ultmaster 男神理所当然地抄袭了小迷妹们的代码,并修改了部分代码。ultmaster 男神想知道他的代码是否会被查重,若会被查重则输出 Yes
否则输出 No
。由于 EOJ 查重系统比较弱智,所以两份代码会被查重的充要条件是,每行代码对应的哈希值都完全同义。
注:同义关系满足自反性,对称性,但不满足传递性。
- 自反性:对于任意 x 同义于 x。
- 对称性:对于任意 x,y,如果 x 同义于 y,则 y 同义于 x。
- 传递性:对于任意 x,y,z,如果 x 同义于 y,y 同义于 z,则 x 同义于 z。
Input
第一行三个整数 n,m,k(1≤n,m,k≤105) 分别表示小迷妹们的代码行数,ultmaster 代码长度,EOJ 查重系统默认的同义关系个数。
第二行 n 个整数 a1,a2,…,an(1≤ai≤109),表示小迷妹们代码每行的哈希值。
第三行 m 个整数 b1,b2,…,bm(1≤bi≤109),表示 ultmaster 代码每行的哈希值。
接下去 k 行,每行两个整数 x,y(1≤x,y≤109),表示哈希值为 x 和 哈希值为 y 同义。同一对 x,y 可能重复出现。
Output
输出一行字符串,Yes
或 No
表示 ultmaster 男神的代码是否会被查重。
Examples
Input
1 1 2 1 3 1 2 2 3
Output
No
Input
2 2 1 1 1 2 2 1 2
Output
Yes
#include<bits/stdc++.h>
const int N=1e5+10;
#define ll long long
using namespace std;
int a[N],b[N];
typedef pair<int,int> P;
set<P> s;
int main(){
int n,m,k;
freopen("in.txt","r",stdin);
ios_base::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
cin>>n>>m>>k;
for(int i=0;i<n;i++){
cin>>a[i];
}
for(int i=0;i<m;i++){
cin>>b[i];
}
for(int i=0;i<k;i++){
int x,y;
cin>>x>>y;
s.insert(P(x,y));
s.insert(P(y,x));
}
if(n!=m){
cout<<"No\n";
return 0;
}
if(m<n)n=m;
bool f=false;
for(int i=0;i<n;i++){
P p(a[i],b[i]);
if(s.find(p)==s.end()){
if(a[i]==b[i])continue;
f=true;
break;
}
}
if(!f)cout<<"Yes\n";
else cout<<"No\n";
}