字典树 hdu 1075

#include<cstring>
#include<iostream>
#include<stdio.h>
using namespace std;
#define maxn1 20
#define maxn2 3000 + 10
struct TrieNode{
	char word[maxn1];
	struct TrieNode * next[ 26 ];
	TrieNode(){
		word[0] = '\0';
		for(int i = 0; i < 26; i ++ ){
			next[i] = NULL;
		}
	}
} Head;
void BuildTrie(char word1[],char word2[]){
	struct TrieNode * p = & Head;
	for(int i = 0; word2[ i ]; i ++ )
	{
		int temp = word2[ i ] - 'a';
		if( p->next[ temp ] == NULL ){
			struct TrieNode * q = new TrieNode;
			p->next[ temp ] = q;
		}
		p = p->next[ temp ];
	}
	strcpy( p->word, word1 );
}
void SearchTrie(char word[]){
	bool leap = true;
	struct TrieNode * p = & Head;
	for(int i = 0; word[ i ]; i ++ ){
		int temp = word[ i ] - 'a';
		if( p->next[ temp ] != NULL ){
			p = p->next[ temp ];
		}
		else{
			leap = false;
			break;
		}
	}
	if(leap&&strlen(p->word))
	{
		printf("%s",p->word);
	}
	else
	{
		printf("%s",word);
	}
}
bool ch(char c){
	if(c>='a'&&c<='z')
		return true;
	else
		return false;
}
int main()
{
	char ss1[maxn2];
	char ss2[maxn2];
	scanf("%s",ss1);
	while(scanf("%s",ss1),strcmp( ss1,"END")){
		scanf("%s",ss2);
		BuildTrie( ss1,ss2 );
	}
	scanf("%s",ss1);
	getchar();
	while(gets(ss1),strcmp( ss1, "END" ) ){
		int i = 0;
		while( ss1[i]){
			if(ch(ss1[i]))
			{
				int k = 0;
				while( ss1[ i ] && ch( ss1[ i ] ) ){
					ss2[ k ] = ss1[ i ];
					k ++;
					i ++;
				}
				ss2[ k ] = '\0';
				SearchTrie( ss2 );
			}
			else{
				printf("%c", ss1[ i ] );
				i ++;
			}
		}
		printf("\n");
	}
	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值