2013资格赛——电话记录

Description

小R由于长得帅气,有很多女生经常打电话给他。所以他经常接到一些在他电话记录没有的电话。今天他出门忘带了电话,晚上回来的时候发现有n个未接来电,有些电话不只打进来一次。小R当然也有自己喜欢的女生,而且不止一个,所以他想知道他喜欢的那m个女生今天有没有给他打电话。

Input

输入有多组,每组的第一行有两个整数n,m(1<=n<=10000,0<=m<=10000)接下来的n行,每行是一个电话号码,长度不超过12位(只由数字组成)。最后m行为他喜欢的女孩的电话号码。

Output

对于每组输入,按输入顺序输出那m个女孩今天给玲岭打电话的次数。

Sample Input

9 3
15124576195
110
120
10086
045188788658
119
15765423780
120
10086
10086
120
15788953201

Sample Output

2
2
0

分析:一开始想到的是开一个long long的数组arr1,然后所有数据输入之后,然后排序,排序之后从头到尾遍历数组,获得每一个电话号码出现的次数,存入另一个数组中arr2[N][2]。然后开始m次输入,此时由于arr2中的数组已经排序完成,所以用二分查找即可。

但是这样却wa了,后来明白原来对于输入 0和00是不同的输入,但是按照上面的那方法,这却被看作为同一种输入。所以,最后选择了对电话号的字符串进行二分查找。这样就AC了。

#include<stdio.h>
#include<stdlib.h>
#include <string.h>

typedef struct{
    char num[15];
    int ans;
}node;
char input[10010][15];
node arr[10010];

int cmp(const void *a,const void *b)
{
        return strcmp((char*)a,(char*)b) ;
}

int binsearch(int l,int r,char ta[15])
{
    int m,rst;
    while(l<=r)
    {
        m=(l+r)/2;
        rst=strcmp(ta,arr[m].num);
        if(rst==0)return arr[m].ans;
        else if(rst<0)r=m-1;
        else l=m+1;
    }
    return 0;
}
int main()
{
    int n,m,i,j,k;
    char tar[15];

    while(~scanf("%d%d",&n,&m))
    {
        for(i=0;i<n;i++)
        {
            scanf("%s",input[i]);
        }
        qsort(input,n,sizeof(input[0]),cmp);
        
        for(k=-1,i=0;i<n;i++)
        {
            if(k==-1|| (strcmp(input[i],arr[k].num)!=0))
            {
                k+=1;
                strcpy(arr[k].num, input[i]) ;
                arr[k].ans=1;
            }
            else arr[k].ans+=1;
        }
        for(i=0;i<m;i++)
        {
            scanf("%s",tar);
                        printf("%d\n",binsearch(0,k,tar));
        }
    }

    return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值