一道一看就知道是用map+string的题,于是上去MTL。。。。坑。。。神坑。。。天坑
双手奉上超时代码/捂脸/捂脸/捂脸↓↓↓
#include
#include
#include
#include
然后不得不用字符数组又来了一发。。。好气哦。。。详细代码如下↓↓↓
#include
#include
#include
#include
#define END "@END@"
using namespace std;
struct Dic {
char name[22]; //咒语名字
char order[82]; //咒语内容
} d[2][100010];//双份的
char c[105];
char k[105];
int cnt;
//咒语名从小到大排序
int cmp1( const void *a , const void *b ) {
struct Dic *A = (Dic*) a;
struct Dic *B = (Dic*) b;
return strcmp( A->name,B->name );
}
//咒语内容从小到大排序
int cmp2( const void *a , const void *b ) {
struct Dic *A = (Dic*) a;
struct Dic *B = (Dic*) b;
return strcmp( A->order,B->order );
}
//二分查找
void binSearch( char *v , int i ) {
int l = 0;
int r = cnt-1;
int mid;
if( i==0 ) {
while( l<=r ) {
mid = ( l+r )/2;
if( strcmp( v,d[i][mid].name )>0 )
l = mid + 1;
else if( strcmp( v,d[i][mid].name )<0 )
r = mid - 1;
else{
//找到直接输出
printf( "%s\n",d[i][mid].order );
return ;
}
}
} else {
while( l<=r ) {
mid = ( l+r )/2;
if( strcmp( v,d[i][mid].order )>0 )
l = mid + 1;
else if( strcmp( v,d[i][mid].order )<0 )
r = mid - 1;
else{
//找到直接输出
printf( "%s\n",d[i][mid].name );
return ;
}
}
}
//找不到输出what
printf( "what?\n" );
}
int main() {
// freopen( "input.txt","r",stdin );
int i,j,t,pos;
cnt = 0;
while( gets(c) && strcmp( c,END )!=0 ) {
//忽略'[',从第1位开始
for( i=1 , j=0; c[i]!=']' ; i++ , j++ )
d[0][cnt].name[j] = c[i];
//字符串终止,一会还要比较的
d[0][cnt].name[j] = '\0';
//从']'到内容的第一个字符
i += 2;
//取内容
for( j=0 ; c[i] ; i++,j++ )
d[0][cnt].order[j] = c[i];
d[0][cnt].order[j] = '\0';
d[1][cnt] = d[0][cnt];
//别忘了计数器+1
cnt++;
}
//双重快排,一个按名字,一个按内容
qsort( d[0],cnt,sizeof(Dic),cmp1 );
qsort( d[1],cnt,sizeof(Dic),cmp2 );
scanf( "%d",&t );
//吸收调皮的换行
getchar();
while( t-- ) {
gets(c);
//处理一下咒语的括号
if( c[0]=='[' ) {
for( i=1,j=0 ; c[i]!=']' ; i++,j++ )
k[j] = c[i];
k[j] = '\0';
//二分查找
binSearch( k,0 );
} else {
binSearch( c,1 );
}
}
}
对了,如果map有什么好方法记得留言告诉我哦ヾ(✿゚▽゚)ノ