【EOJ 2967 公共元素】(STL 求交集)

4 篇文章 0 订阅

Time limit per test: 2.0 seconds

Memory limit: 256 megabytes

给定三个自然数数组(长度为 1-100),求在三个数组中都存在的元素,-1 表示三个数组没有公共元素。

Input
第 1 行:整数 T T (1T10) 为问题数

第 2 行,以空格隔开的三个数组的长度

第 3 行,以空格隔开的第一个数组

第 4 行,以空格隔开的第二个数组

第 5 行,以空格隔开的第三个数组

第 6 ∽ 4*T+1 行:后面每一个问题中的数据,格式与第一个问题相同。

Output
对于每个问题,输出一行问题的编号(0 开始编号,格式:case #0: 等),然后在一行中按从小到大的顺序输出三个数组的公共元素,元素间以空格隔开,最后一个元素后没有空格但有回车。如果三个数组中没有公共元素,则输出-1。

Examples
input
4
2 3 4
0 3
4 3 0
3 9 0 7
3 2 4
3 2 9
1 4
3 2 8 7
9 8 7
9 8 7 6 5 4 3 2 1
9 8 7 6 5 4 3 2
9 8 7 6 5 4 3
30 25 35
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30
8 9 1 5 10 20 43 42 21 22 23 12 13 41 40 39 14 2 6 7 3 4 19 45 44
8 9 1 2 6 7 3 4 5 10 20 21 22 23 12 13 14 19 25 27 31 24 11 15 16 28 17 18 29 30 35 33 26 34 32
output
case #0:
0 3
case #1:
-1
case #2:
3 4 5 6 7 8 9
case #3:
1 2 3 4 5 6 7 8 9 10 12 13 14 19 20 21 22 23

分析:
stl 集合运算
set_intersection(xx.begin(),xx.end(),yy.begin(),yy.end(),inserter(I,I.begin()));
差集
set_union并集
set_intersection交集

以下是迭代的方法:
set::iterator iter=tmp2.begin();
while(iter!=tmp2.end())
{
cout<<(*iter);
++iter;
}

#include <bits/stdc++.h>
using namespace std;

#define mem(a,n) memset(a,n,sizeof(a))
#define memc(a,b) memcpy(a,b,sizeof(b))
#define rep(i,a,n) for(int i=a;i<n;i++) ///[a,n)
#define dec(i,n,a) for(int i=n;i>=a;i--)///[n,a]
#define pb push_back
#define fi first
#define se second
#define IO ios::sync_with_stdio(false)
#define fre freopen("in.txt","r",stdin)
#define lson l,m,rt<<1
#define rson m+1,r,rt<<1|1
typedef long long ll;
typedef unsigned long long ull;
const double PI=acos(-1.0);
const double E=2.718281828459045;
const double eps=1e-8;
const int INF=0x3f3f3f3f;
const int MOD=258280327;
const int N=1e3+5;
const ll maxn=1e6+5;
const int dir[4][2]= {-1,0,1,0,0,-1,0,1};
set<int>st1,st2,st3;
set<int>ans1,ans;
int main()
{
    //fre;
    int T,cas=0 ;
    int a,b,c;
    scanf("%d",&T);
    while(T--)
    {
        int x;
        scanf(" %d %d %d",&a,&b,&c);
        while(a--) scanf("%d",&x),st1.insert(x);
        while(b--) scanf("%d",&x),st2.insert(x);
        while(c--) scanf("%d",&x),st3.insert(x);
        set_intersection(st1.begin(),st1.end(),st2.begin(),st2.end(),inserter(ans1,ans1.begin()));
        set_intersection(ans1.begin(),ans1.end(),st3.begin(),st3.end(),inserter(ans,ans.begin()));
        int sz=ans.size();
        printf("case #%d:\n",cas++);
       // printf("sz=%d\n",sz);
        if(!sz) cout<<-1;
        else
        {
            set<int>::iterator it=ans.begin();
            bool flag=1;
            while(it!=ans.end())
            {
                if(flag) flag=0;
                else cout<<" ";
                cout<<(*it),it++;
            }
        }
        puts("");
        st1.clear(),st2.clear(),st3.clear();
        ans.clear(),ans1.clear();
    }
    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值