集合运算

来源:互联网 发布:阿里云百倍故障赔偿 编辑:程序博客网 时间:2024/05/18 01:51

集合运算

时间限制(普通/Java):3000MS/10000MS          运行内存限制:65536KByte
总提交:124            测试通过:39

描述

给定两个集合A和B的所有元素,计算它们的交、并、差集。

输入

输入数据有多组,第一行为数据的组数T,接下来有2T行,每组数据占2行,每行有若干个整数,第一行的所有整数构成集合A,第二行的所有整数构成集合B,分别用空格分隔。A和B最多分别不超过100个元素。

输出

输出A、B的交、并、差集中的所有元素(以递增顺序)。每个集合占一行,数据元素之间用空格分隔。

样例输入

1
0 1 2 3 4 5 6 7 8 8
3 6 8 9

样例输出

3 6 8
0 1 2 3 4 5 6 7 8 9
0 1 2 4 5 7

用STL做的,上网查了一些资料。


#include<iostream>#include<cstring>#include<sstream>#include<cstdio>#include <algorithm>#include<set>using namespace std;int main(){    set<int>a;    set<int>b;    set<int>c;    int n,x,l,aa;    string str1,str2;    scanf("%d",&n);    getchar();    while(n--)    {        int i=0,j=0,x=0,f=1,t;        getline(cin,str1);        std::stringstream ss(str1);        while (ss>>aa)        {            a.insert(aa);        }        getline(cin,str2);        std::stringstream ss1(str2);        while (ss1>>aa)        {            b.insert(aa);        }        set<int>::iterator ii;        set_intersection(a.begin(),a.end(),b.begin(),b.end(),insert_iterator<set<int> >(c,c.begin()));        l=c.size();        i=0;        for(ii=c.begin(); ii!=c.end(); ii++)        {            i++;            if(i<l) printf("%d ",(*ii));            else printf("%d\n",*ii);        }        c.clear();        set_union(a.begin(),a.end(),b.begin(),b.end(),insert_iterator<set<int> >(c,c.begin()));        l=c.size();        i=0;        for(ii=c.begin(); ii!=c.end(); ii++)        {            i++;            if(i<l) printf("%d ",(*ii));            else printf("%d\n",(*ii));        }        c.clear();        set_difference(a.begin(),a.end(),b.begin(),b.end(),insert_iterator<set<int> >(c,c.begin()));        l=c.size();        i=0;        for(ii=c.begin(); ii!=c.end(); ii++)        {            i++;            if(i<l) printf("%d ",(*ii));            else printf("%d\n",(*ii));        }        c.clear();    }    return 0;}



原创粉丝点击