思路:
不相同就是去除重复,然后两个集合的相似度就是它们的交集/并集。
C++提供了set函数可以很简单的求出集合的交集合并。
所以先插入集合,然后求交集就好了。
#include<iostream>
#include<cstdio>
#include<set>
#include<cstring>
#include<vector>
#include<algorithm>
using namespace std;
const int maxn = 100100;
struct Node{
set <int> st;
}cur[maxn];
int a[maxn];
int main(void)
{
int n,m,k,i,j,x,y,l1,l2;
scanf("%d",&n);
for(i=1;i<=n;i++){
scanf("%d",&m);cur[i].st.clear();
for(j=1;j<=m;j++) scanf("%d",&a[j]);
sort(a+1,a+1+m);
for(j=1;j<=m;j++)
if(!cur[i].st.count(a[j])){
cur[i].st.insert(a[j]);
}
}
vector <int> vc;
scanf("%d",&k);
while(k--){
scanf("%d%d",&x,&y);vc.clear();
l1=cur[x].st.size()+cur[y].st.size();
set_intersection(cur[x].st.begin(),cur[x].st.end(),cur[y].st.begin(),cur[y].st.end(),back_inserter(vc));
l2=vc.size();
printf("%.2lf%%\n",l2*100.0/(l1-l2));
}
return 0;
}