问题十分简单,关键在于数据量大直接循环做会超时。这里采用先排序再二分搜索的方法。排序用qsort(),搜索用bsearch()(不知道怎么用的看这里 c语言中几个很有用的函数)。
还可以用树来做,建一个二十六叉树,这样时间和空间效率都将提升不少,不过比排序做要麻烦。
Accepted | 1109 | C | 00:00.56 | 3628K |
#include<stdio.h>
#include<string .h>
#include <stdlib.h>
struct s
{
char a[11 ];
char b[11 ];
}d[100008 ];
char w[100008][11 ];
int cmp(const void* a,const void* b)
{
return strcmp((*(struct s*)a).b,(*(struct s* )b).b);
}
int cmp1(const void* a,const void* b)
{
return strcmp((char *)a,(*(struct s* )b).b);
}
void solve()
{
char temp[22 ];
int cnt1,cnt2,k;
cnt1 = cnt2 = k = 0 ;
while(1 )
{
int i = 0,j = 0 ;
gets(temp);
if(temp[0] == 0 )
break ;
while(temp[i] != ' ' )
d[cnt1].a[i] = temp[i++ ];
while(temp[++i] != 0 )
d[cnt1].b[j++] = temp[i];
cnt1++ ;
}
while(scanf("%s",w[cnt2++]) != EOF);
cnt2-- ;
qsort(d,cnt1,sizeof(d[0 ]),cmp);
for(k = 0; k < cnt2; k++ )
{
struct s* t;
t = bsearch(w[k],d,cnt1,sizeof(d[0 ]),cmp1);
t == NULL ? puts("eh") : puts(t-> a);
}
}
void main()
{
#ifndef ONLINE_JUDGE
freopen("test.txt","r",stdin);
#include<string .h>
#include <stdlib.h>
struct s
{
char a[11 ];
char b[11 ];
}d[100008 ];
char w[100008][11 ];
int cmp(const void* a,const void* b)
{
return strcmp((*(struct s*)a).b,(*(struct s* )b).b);
}
int cmp1(const void* a,const void* b)
{
return strcmp((char *)a,(*(struct s* )b).b);
}
void solve()
{
char temp[22 ];
int cnt1,cnt2,k;
cnt1 = cnt2 = k = 0 ;
while(1 )
{
int i = 0,j = 0 ;
gets(temp);
if(temp[0] == 0 )
break ;
while(temp[i] != ' ' )
d[cnt1].a[i] = temp[i++ ];
while(temp[++i] != 0 )
d[cnt1].b[j++] = temp[i];
cnt1++ ;
}
while(scanf("%s",w[cnt2++]) != EOF);
cnt2-- ;
qsort(d,cnt1,sizeof(d[0 ]),cmp);
for(k = 0; k < cnt2; k++ )
{
struct s* t;
t = bsearch(w[k],d,cnt1,sizeof(d[0 ]),cmp1);
t == NULL ? puts("eh") : puts(t-> a);
}
}
void main()
{
#ifndef ONLINE_JUDGE
freopen("test.txt","r",stdin);
#endif
solve();
#ifndef ONLINE_JUDGE
fclose(stdin);
solve();
#ifndef ONLINE_JUDGE
fclose(stdin);
#endif
}
}