您的位置:首页 > 其它

2013资格赛——电话记录

2013-08-24 16:04 204 查看
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
[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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: