Poj 2503

一道相对简单又经典的题目,可以用多种方法进行求解。

1、直接用stl map解决,水过。不过效率相对有差些。 907Ms

/*poj2503, wrote by Dream Chen 2011/4/1*/

#include <iostream>
#include <string>
#include <map>
using namespace std;

map<string,string> map_word;
void GetWord(const string &srcline, string &first, string &second);
int main()
{
	string line;
	while (getline(cin,line))
	{
		string first;
		string second;
		if (0 == line.length())
		{
			break;
		}
		GetWord(line, first, second);
		map_word[second] = first;
	}

	while(getline(cin, line))
	{
		int i = map_word.count(line);
		if (i > 0)
		{
			cout << map_word[line] << endl;
		}
		else
		{
			cout << "eh" << endl;
		}
	}
	return 0;
}


void GetWord(const string &srcline, string &first, string &second)
{
	int i = srcline.find_first_of(' ');
	first = srcline.substr(0,i);
	int j = srcline.find_first_not_of(' ', i);
	second = srcline.substr(j, srcline.length() - j);
}

2、用一个二维数据的完全hash.  563MS

/* Poj 2503, Wrote by Dream, 2011/4/24*/
#include <iostream>
using namespace std;

const int PRIME = 13131;
int hash[PRIME][131];
char foreignword[100010][12];
char englishword[100010][12];

void Initial();
bool readWordfromstdin(char *word);
int gethash(char *word);
void sethash(int i, int h);
int translate(char *dst, char *src);

int main()
{
	Initial();
	int i = 1;
	while(readWordfromstdin(englishword[i]))
	{
		readWordfromstdin(foreignword[i]);
		sethash(gethash(foreignword[i]), i);
		++i;
	}
	char tmpforword[12];
	while(readWordfromstdin(tmpforword))
	{
		translate(tmpforword, tmpforword);
		printf("%s/n", tmpforword);
	}
	return 0;
}

void Initial()
{
	memset((void*)foreignword, 0, sizeof(foreignword));
	memset((void*)englishword, 0, sizeof(englishword));
	memset((void*)hash, 0, sizeof(hash));
}

int translate(char *dst, char *src)
{
	int h = gethash(src);
	int j = 0;
	while(hash[h][j] != 0 && strcmp(foreignword[hash[h][j]], src)!= 0 && j < PRIME)
		++j;
	if (hash[h][j] == 0 || j >= PRIME)
	{
		strcpy(dst, "eh");
		return false;
	}
	strcpy(dst, englishword[hash[h][j]]);
	return true;
}

void sethash(int i, int h)
{
	int j = 0;
	while(hash[i][j] != 0)
		++j;
	hash[i][j] = h;
}
bool readWordfromstdin(char *word)
{
	char ch = '/0';
	ch = getchar();
	if ('/n' == ch || ch == EOF)
	{
		return false;
	}
	*word = ch; 
	++word;
	while((ch = getchar())!=' ' && ch != '/n' && ch != EOF)
	{
		*word++ = ch; 
	}
	*word = '/0';
	return true;
}

int gethash(char *word)
{
	int h = 0;
	while(*word != '/0')
	{
		h = (h * 26 + *word - 'a') % PRIME;
		++word;
	}
	return h;
}
3、用Tried树进行单词的存储与查找,可以较高地提高速度,不过消耗内在较大,附代码,250Ms水过
/*	poj2503, written by Dream, 2011/4/25	*/

#include<iostream>
#include<cstring>
using namespace std;
const int Max = 260050;
const int branchNum = 26;

struct TriedNode 
{
	char re[12];
	TriedNode *branch[branchNum];
};

TriedNode root;
TriedNode node[Max];
int p = 0;

void Initial()
{
	memset((void*)node, 0, sizeof(node));
}
void Insert(char *word, char *re)
{
	if (NULL == word)
	{
		return;
	}
	TriedNode *location = &root;
	while(*word)
	{
		if (NULL == location->branch[*word - 'a'])
		{
			location->branch[*word - 'a'] = &node[p++];
		}
		location = location->branch[*word - 'a'];
		++word;
	}
	strcpy(location->re, re);
}

void Search(char *res, char *word)
{
	if (NULL == word)
	{
		return;
	}
	TriedNode *location = &root;
	while(*word)
	{
		if (location->branch[*word - 'a'])
		{
			location = location->branch[*word - 'a'];
		}
		else
		{
			strcpy(res, "eh");
			return;
		}
		++word;
	}
	strcpy(res, location->re);
}

int main()
{
	char word[12];
	char eng[12];
	char res[12];
	char ch = '/0';
	Initial();
	while(scanf("%s%s", eng,word) != EOF)
	{
		Insert(word, eng);
		getchar();
		ch = getchar();
		if ('/n' != ch)
		{
			ungetc(ch, stdin);
			continue;
		}
		break;
	}
	while(scanf("%s", word) != EOF)
	{
		Search(res, word);
		printf("%s/n", res);
	}

	return 0;
};

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值