STL——Jerry的问题

Description
最近Jerry正在刻苦的学习STL中的set的功能函数,他发现set可以用现有的函数实现并、交、差、对称差等功能,但是他没有找到怎么来比较两个集合是否相等的功能函数,所以他想自己用其他的功能函数来实现能判断两个集合是否相等的功能函数。聪明的Jerry不一会就想到了解决办法,现在他想拿这道题来考考你,看你有没有他聪明。

Input

输入有多组,每组数据有两行,每一行都代表一个集合,每一行有若干个正整数(0<d<=2147483647),并且每行的最后一个数字都是0,代表该行数据的结束,且末尾的0不计入集合中。最后以EOF结束输入。

Output
对于每组数据输出都要输入一个结果,如果两个集合相等便输出“YES”,否则输出“NO”,每个结果占一行

Sample Input
1 2 3 4 0
1 2 3 4 0
1 2 2 2 2 2 0
1 2 0
1 2 3 4 0
1 3 3 4 0
Sample Output
YES
YES
NO


HINT
对称差运算:得到的结果是第一个集合与第二个集合的差集并上第二个与第一个的差集


Append Code

AC代码1

#include <iostream>
#include <set>
#include <algorithm>
#include <vector>
#include <string>
using namespace std;

int main()
{
    int i;
    while(cin>>i)//这里代表着当输入的i不是EOF的时候;
    {
        set<int>A,B;//注意定义的位置;
        if(i)//这里一定要注意这种输入方法,当i不为0的时候才在A中存数字;
        {
            A.insert(i);
            while(cin>>i&&i!=0)//这里必须写cin>>i,因为如果不写的话就没有数据输入了;//这里控制以0结尾;
                A.insert(i);
        }
        while(cin>>i&&i!=0)
        {
            B.insert(i);
        }
        set<int>A1;
        set_symmetric_difference(A.begin(),A.end(),B.begin(),B.end(),inserter(A1,A1.begin()));
        if(A1.size())//如果差集为空集的话,size为0,如果为0的话执行下面的语句,如果不为0的话执行下面的语句,最好不要用A1.empty;
            cout<<"NO"<<endl;
        else
            cout<<"YES"<<endl;
    }
    return 0;
}

注意:
1、最后以EOF结束输入的表示方法while(cin>>i)即可,但是这里仅仅是输入了一个数据。
2、输入A的时候千万不能采用下面的方法

while(cin>>i&&i!=0)
{
    A.insert(i);
}

因为刚开始为了让输入!=EOF已经采用了cin>>i;如果下面直接在cin的话,如果第一个不是0的话也没有存进去,所以要采用上面的方法来输入i;


AC代码二

#include <bits/stdc++.h>

using namespace std;
bool find_(const set<int> A,const set<int> B)
{
    if(A.size()!=B.size())
        return false;
    set<int>::iterator it;
    for(it=A.begin();it!=A.end();it++)
        if(!B.count(*it))
            return false;
    return true;
}
int main()
{
    int n;
//    set<int> A,B;//这个在外面和在里面不一样
    while(cin>>n)//用while而不是if;
    {
        set<int> A,B;
        if(n)
        {
            A.insert(n);
            while(cin>>n&&n!=0)
                A.insert(n);
        }
        while(cin>>n&&n!=0)
            B.insert(n);
//        set<int>A1,A2,A3;
//        set_difference(A.begin(),A.end(),B.begin(),B.end(),inserter(A1,A1.begin()));
        int fi=find_(A,B);
        if(!fi)
            cout<<"NO"<<endl;
        else
            cout<<"YES"<<endl;
    }
    return 0;
}

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值