解题思路:无非就是求两个集合的交集。这次发现set_intersection这个函数运行速度比自己手工枚举求交集快了快一倍!!
#include<cstdio>
#include<cstring>
#include<queue>
#include<stack>
#include<set>
#include<algorithm>
#include<iterator>
#include<vector>
using namespace std;
set<int> s[50],p;
set<int>::iterator it;
int main()
{
//freopen("t.txt","r",stdin);
int n,k,a,b,t,m,num1;
scanf("%d",&n);
for(int i=0;i<n;i++)
{
scanf("%d",&k);
while(k--)
{
scanf("%d",&t);
s[i].insert(t);
}
}
scanf("%d",&m);
while(m--)
{
scanf("%d%d",&a,&b);
a--;b--;
p.clear();
set_intersection(s[a].begin(),s[a].end(),s[b].begin(),s[b].end(), insert_iterator<set<int> >(p,p.begin()));
//num1=0;
/*for(it=s[a].begin();it!=s[a].end();it++)
{
if(s[b].find(*it)!=s[b].end()) num1++;
}*/
num1=p.size();
int num2=s[a].size()+s[b].size()-num1;
printf("%.2lf%%\n",(double)num1*1.0/num2*100);
}
return 0;
}