前言必读!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;
}