题目链接:http://poj.org/problem?id=2503
题意:给一个词典,格式为单词x对应单词y,现在输入一些单词y,输出各自对应的单词x。
思路:建一棵trie树,在每个单词的结尾字母节点处附上单词y。然后查找的时候直接输出结尾字母节点的单词即可。
或者也可以用map水一下。
trie树代码
#include <iostream>
#include <cstdio>
#include <cstring>
#include <string>
#include <algorithm>
#include <map>
using namespace std;
#define rep(i,j,k) for(int i = j; i <= k; i++ )
#define Rrep(i,j,k) for(int i = j; i >= k; i-- )
#define Clean(x,y) memset(x,y,sizeof(x))
const int maxn = 26;
struct trie
{
trie* next[maxn];
string s;
};
void init(trie *t)
{
t->s = "";
rep(i,0,maxn-1) t->next[i] = NULL;
}
void insert(trie *x,char s[],char t[])
{
int k = 0;
while( s[k] )
{
int index = s[k] - 'a';
if ( x->next[index] == NULL )
{
x->next[index] = new trie;
init( x->next[index] );
}
x = x->next[index];
k++;
}
x->s = string(t);
}
void query(trie* x,char s[])
{
int k = 0;
while( s[k] )
{
int index = s[k] - 'a';
if ( x->next[index] == NULL )
{
x->next[index] = new trie;
init( x->next[index] );
}
x = x->next[index];
k++;
}
if ( x->s =="" )
puts("eh");
else cout<<x->s<<endl;
}
trie *t;
char c;
char t1[maxn];
char t2[maxn];
int main()
{
t = new trie;
init(t);
while( ( c = getchar() ) != '\n' )
{
int l = 0;
t1[l] = c;
while( ( c = getchar() ) !=' ' ) t1[++l] = c;
t1[++l] = '\0';
scanf("%s",t2);
getchar();
insert(t,t2,t1);
}
while( gets( t1 ) ) query(t,t1);
return 0;
}
map代码
#include <iostream>
#include <cstdio>
#include <cstring>
#include <string>
#include <algorithm>
#include <map>
using namespace std;
#define rep(i,j,k) for(int i = j; i <= k; i++ )
#define Rrep(i,j,k) for(int i = j; i >= k; i-- )
#define Clean(x,y) memset(x,y,sizeof(x))
const int maxn = 200;
map<string,string> p;
char t1[maxn];
char t2[maxn];
string temp;
char c;
int main()
{
p.clear();
while( ( c = getchar() ) !='\n' )
{
int l = 0;
t1[l] = c;
while( ( c = getchar() ) !=' ' ) t1[++l] = c;
t1[++l] = '\0';
scanf("%s",t2);
getchar();
p[ string(t2) ] = string(t1);
}
while(gets(t1))
{
string key;
key = string(t1);
if ( p[key]=="")
puts("eh");
else
cout<<p[ key ]<<endl;
}
return 0;
}