POJ 2503-Babelfish

http://poj.org/problem?id=2503

这是一道字符串处理的题。有点写字典,查字典的意思,首先要解决的是输入字典和查字典时输入单词中间的那

一个空行,我是用gets输入前面的东西,所以只需一个判断就可以跳出输入字典的循环。然后是输入单词翻译,

因为字典当中的单词比较多,我又不会hash,所以用了二分查找。

#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#define M 100003

typedef struct dictionary
{
char f[15];
char n[15];
}D;

D dic[M];

/* 按照后一个单词的字典序升序排序 */
int cmp( const void *_p, const void *_q)
{
D *q = (D *)_q;
D *p = (D *)_p;
return strcmp( p->n, q->n);
}

int main()
{
char s[30];
int i = 0;
while( gets(s) != NULL)
{
if( s[0] == '\0') break; //结束字典的输入
sscanf( s, "%s%s", dic[i].f, dic[i].n);
i ++;
}
qsort( dic, i, sizeof( dic[0]), cmp);
int x, y;
while( gets(s) != NULL)
{
x = 0, y = i; //让x,y分别等于第一个和最后一个下标
while( x < y) //二分查找
{
int m = x + (y - x) / 2;
if( strcmp( dic[m].n, s) == 0) {
printf( "%s\n", dic[m].f);
break;
}
else if( strcmp( dic[m].n, s) > 0)
y = m;
else x = m + 1;
}
if( x >= y) printf( "eh\n");
}
return 0;
}

 

今天看了字典树原理,顺便将这道题再写了一遍。

(字典树)

字典树的基本功能是用来查询某个单词(前缀)在所有单词中出现次数的一种数据结构,

它的插入和查询复杂度都为O(len),Len为单词(前缀)长度,但是它的空间复杂度却非

常高,如果字符集是26个字母,那每个节点的度就有26个,典型的以空间换时间结构。

/*Accepted    13604K    235MS    C++    904B    2012-08-02 10:33:31*/
#include<stdio.h>
#include<string.h>
#include<stdlib.h>

typedef struct{

    int next[26];
    char eng[11];
}Trie;
Trie t[200000];
char en[11], fr[11];
int tp;

void insert(char *x, int site)
{
    if(*x)
    {
        if(!t[site].next[*x - 'a'])
            t[site].next[*x - 'a'] = ++ tp;
        insert(x + 1, t[site].next[*x - 'a']);
    }
    else
        strcpy(t[site].eng, en);
}

void search(char *x, int site)
{
    if(*x)
    {
        if(!t[site].next[*x - 'a'])
        {
            printf("eh\n");
            return;
        }
        search(x + 1, t[site].next[*x - 'a']);
    }
    else
        printf("%s\n", t[site].eng);
}

int main()
{
    char s[25];
    while(gets(s) && s[0] != '\0')
    {
        sscanf(s, "%s%s", en, fr);
        insert(fr, 0);
    }
    while(scanf("%s", fr) == 1)
        search(fr, 0);
    return 0;
}

转载于:https://www.cnblogs.com/Yu2012/archive/2011/11/03/2234375.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值