这题的代码写得好恶心。。二分查找,连改进的心情都没。。。
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<cstdlib>
#include<string>
#include<queue>
#include<vector>
#include<map>
using namespace std;
char eng[501000][12],mars[501000][12],tran[3010];
int r[501000];
int search(int left,int right){
int mid=(left+right)>>1;
// printf("%d\n",mid);
if(left>right) return -1;
if(left==right)
if(strcmp(mars[left],tran)==0)
return left;
else
return -1;
if(strcmp(mars[mid],tran)<0)
search(mid+1,right);
else if(strcmp(mars[mid],tran)>0)
search(left,mid);
else
return mid;
}
int cmp1(const void *a,const void *b){
char *s1=mars[*(int *)a];
char *s2=mars[*(int *)b];
return strcmp(s1,s2);
}
int cmp2(const void *a,const void *b){
char *s1=(char *)a,*s2=(char *)b;
return strcmp(s1,s2);
}
int main()
{
char text[3010],s[10];
while(scanf("%s",s)!=EOF){
int k=0;
scanf("%s",eng[k]);
while(strcmp(eng[k],"END")){
scanf("%s",mars[k++]);
scanf("%s",eng[k]);
}
for(int i=0;i<k;i++)
r[i]=i;
qsort(r,k,sizeof(r[0]),cmp1);
qsort(mars,k,sizeof(mars[0]),cmp2);
// for(int i=0;i<k;i++)
// printf("%d ",r[i]);
// puts("");
gets(text);
gets(text);
gets(text);
// puts(text);
while(strcmp(text,"END")){
int len=strlen(text);
for(int i=0,j=0;i<len;i++)
if(text[i]<='z'&&'a'<=text[i])
tran[j++]=text[i];
else{
if(j){
tran[j]='\0';
int judge=search(0,k-1);
// printf("%d\n",judge);
if(judge==-1)
printf("%s",tran);
else
printf("%s",eng[r[judge]]);
j=0;
}
putchar(text[i]);
}
puts("");
gets(text);
}
}
return 0;
}