/*
START
from fiwo
hello difh
mars riwosf
earth fnnvk
like fiiwj
END
START
difh, i'm fiwo riwosf.
i fiiwj fnnvk!
END
hello, i'm from mars.
i like earth!
*/
#include <iostream>
#include <string>
#include <istream>
using namespace std;
typedef long long ll;
const int N = 1000100;
string s,ss[N];
bool fall[N] ;
int son[N][26],cnt[N],idx;//cnt计数貌似没用
void insert(string s,string t)
{
int p = 0;
for (int i = 0; i<s.size(); i ++ )
{
int u = s[i] - 'a';
if (!son[p][u]) son[p][u] = ++ idx;
p = son[p][u];
cnt[p] ++ ;
}
ss[p]=t;//存要翻译输出的
fall[p]=true;//判断是否找得到 (做标记)
}
string query(string s)
{
int p = 0;
for (int i = 0; i<s.size(); i ++ )
{
int u = s[i] - 'a';
if (!son[p][u])
{
return s;
}
p = son[p][u];
}
if(fall[p]) return ss[p];
else return s;
}
int main()
{
string s;
cin>>s;
while (cin>>s,s != "END") {
string t;cin>>t;
insert(t,s);//注意s,t分别表示的字符串
}
cin>>s;
getchar();
while(getline(cin,s))
{
if(s=="END") break;
string t;
for(int i=0;i<s.size();i++)
{
if(islower(s[i])) //判断字符c是否为小写字母,是的话存起来,遇END一起进query判断是否找得到
{
t+=s[i];
}else{
cout<<query(t);
cout<<s[i];
t.clear();//输出后清除,避免再次输出
}
}
cout<<endl;
}
return 0;
}
原题链接:http://acm.hdu.edu.cn/showproblem.php?pid=1075