交集

来源:互联网 发布:sdr软件无线电 飞行 编辑:程序博客网 时间:2024/06/07 12:44

问题 P: 交集
时间限制: 1 Sec 内存限制: 128 MB
提交: 5299 解决: 1171
[提交][状态][讨论版]
题目描述
有两个相等长度的正整数序列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

#include<stdio.h>#define maxsize 1000000typedef struct{    int *elem;    int length;}sqlist;void initlist(sqlist &L){    L.elem=new int[maxsize];    L.length=0;}void creatlist(sqlist &L,int n){    int j=0,i,k;    for(k=0;k<2*n;k++)    {        scanf("%d",&i);        L.elem[j++]=i;    }}int main(){    int n;    int i,j,k=0;    sqlist L;    initlist(L);    int b[1000];    while(~scanf("%d",&n)&&n)    {    if(n!=1)    {    creatlist(L,n);    i=0,j=n;    k=0;    while(i<=n-1&&j<=2*n-1)    {        if(L.elem[i]==L.elem[j])            {b[k++]=L.elem[i];i++,j++;}        else        {            if(L.elem[i]<L.elem[j])                i++;            else                j++;        }    }    printf("%d",k);    if(k)    {    printf(" ");    for(i=0;i<k-1;i++)     printf("%d ",b[i]);     printf("%d\n",b[i]);    }    else    printf("\n");    }    else    {        int i1,i2;        scanf("%d",&i1);        scanf("%d",&i2);        if(i1==i2)            printf("1 %d\n",i1);        else            printf("0\n");    }    }}
原创粉丝点击