POJ-2503 Babelfish(排序加二分查找 )
题目链接:POJ-2503
题目大意:给定一些字符串和其对应的字符串 在给定一些需要查找的字符串 输出查找字符串的对应字符串 若查找字符串并不存在 则输出eh
解题思路:首先这个题给出的字符串<100000 直接对遍历查找肯定会超时 所以就会想到二分查找 二分查找前提字符串顺序排列 如果单纯的对字符串排序 那么字符串和对应字符串之间的关系就会打乱 所以需要使用结构体 使用sort()需要自己改 最后流程是这样的输入->排序->查找->输出
代码块:
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
struct sss{
char str[12];
char toStr[12];
};
typedef struct sss structStr;
structStr node[100001];
int size = 0;
bool cmp(structStr o1,structStr o2){
return strcmp(o1.str,o2.str)<0;
}
int search(char sss[]);
int main(){
char sss[100];
// 对前面的数据进行输入处理
while(gets(sss)){
if(sss[0] == '\0') break;
sscanf(sss,"%s %s",node[size].toStr,node[size].str);
size++;
}
//排序
sort(node,node+size,cmp);
while(scanf("%s",sss)!=EOF){
//二分查找
int index = search(sss);
if(strcmp(node[index].str,sss) == 0){
printf("%s\n",node[index].toStr);
}else{
printf("eh\n");
}
}
return 0;
}
int search(char sss[]){
int left = 0;
int right = size - 1;
while(left<right){
int mid = (left + right)/2;
if(strcmp(sss,node[mid].str) == 0){
return mid;
}
else if(strcmp(sss,node[mid].str)<0){
right = mid - 1;
}else{
left = mid +1;
}
}
return left;
}