问题 E: 交集

本文介绍了一种求解两个有序序列交集的高效算法,并提供了一个C++代码示例。该算法利用STL set实现,同时也给出了不使用STL set的解决思路。适用于ACM竞赛及算法练习。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前言必读!http://blog.youkuaiyun.com/hnust_v/article/details/51747743
问题 E: 交集

题目描述

有两个相等长度的正整数序列A和B,都是有序的(递增排序),同时一个序列中没有重复元素,现在需要求这两个序列的交――序列C,同时打印输出。
输入

每个测试用例一共有2*n+1行,第一行输入为数列的长度n,然后下面2~n+1行,依次输入序列A中的数。n+2~2*n+1行,依次输入序列B中的数。
其中 1 <= n <= 50000 , 序列中每个数大小不会超过1000000。当程序输入n为0时表示结束。
输出

每个测试用例输出一行,先输出序列C的长度,然后依次输出C中的整数,两个数之间间隔一个空格。注意行末不要出现空格。C中的整数递增排序。
样例输入

5 1 2 5 6 7 1 2 4 6 9 0
样例输出

3 1 2 6
提示

来源: http://acm.hnust.edu.cn/JudgeOnline/problem.php?cid=1211&pid=4

/*这里我使用了STL set  但是如果不会使用也可以先读入数组A,读入数组B时进行指标游动的方式对比,时间复杂度仅为O(n)并且同样易实现*/

#include <bits/stdc++.h>
using namespace std;
int A[50500]={};
int main()
{
  // freopen("E:\\test.txt","r",stdin);
    //freopen("E:\\tsst.txt","w",stdout);
    int n;
    while(cin>>n&&n)
    {
        int Count=0;
        set<int> S;
        for(int i=1,a;i<=n;i++)
        {
            scanf("%d",&a);
            S.insert(a);
        }
        for(int i=1,a;i<=n;i++)
        {
            scanf("%d",&a);
            if(S.find(a)!=S.end()) A[++Count]=a;
        }
        if(!Count) printf("0\n");
        else
        {
            printf("%d ",Count);
            for(int i=1;i<=Count;i++) printf("%d%c",A[i],i==Count?'\n':' ');
        }

    }
    return 0;
}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值