链接: https://www.nowcoder.net/acm/contest/76/C
来源:牛客网
给你两个升序排列的集合,求出两个集合的交集。
输入描述:
有多个测试用例,输入到文件结束。 对于每一个测试用例: 第一行输入两个整数n,m(0<n,m<=1000000),分别代表第一个集合和第二个集合的元素的数量。 第二行输入n个整数,表示第一个集合中的元素,元素之间用空格隔开。 第三行输入m个整数,表示第二个集合中的元素,元素之间用空格隔开。 两个集合中的元素范围在[-1000000000,1000000000]区间内。
输出描述:
每个测试用例用一行来输出两个集合的交集的所有元素(元素用空格隔开且按升序排列),若交集为空则输出"empty"。
示例1
输入
2 3 1 3 1 2 3
输出
1 3
备注:
交集为空的情况下,输出"empty" 。
#include <cstdio> #include <iostream> #include <cstring> #include <algorithm> #include <cmath> #include <vector> #include <queue> using namespace std; #define f(i,l,r) for(int i=l;i<=r;++i) #define g(i,l,r) for(int i=l;i>=r;--i) const int N = 1000001; typedef long long ll; ll a[N],b[N],c[N]; int n,m; int main() { std::ios::sync_with_stdio(false); std::cin.tie(0); while(cin>>n>>m) { memset(a,0,sizeof(a)/sizeof(a[0])); memset(b,0,sizeof(b)/sizeof(b[0])); memset(c,0,sizeof(c)/sizeof(c[0])); f(i,1,n)cin>>a[i]; f(i,1,m)cin>>b[i]; int h=1,j=1,k=1; h=1; while(h<=n&&j<=m){ if(a[h]==b[j]) { c[k++]=a[h]; h++;j++; } else if(a[h] > b[j])j++; else h++; } if(k==1){ cout<<"empty"<<endl; continue; } f(i,1,k-2)cout<<c[i]<<" "; cout<<c[k-1]; } return 0; }未来的我一定会感谢正在努力的现在的我!