// hdu 1075 字典树
//
// 题目大意:
//
// 给你一个字典,即有两个字符串,一个是英文,一个是火星文,然后
// 输入一段火星文,要你翻译成英文。
//
// 解题思路:
//
// 字典树,查字典嘛,有就输出查到的,没有原样输出。将火星文插入到
// 字典树中,然后在字典输中查找。找到了,输出对应的英文,否则,原样输
// 出。
//
// 感悟:
//
// 题目确实很简单,但是,没告诉数据范围啊,导致我一直RE,原来单词
// 可能对应很长的英文啊,找人家ac的开数组的范围,AC了,这种题我真是无语
// 了,以我微薄的能力没看出什么能精确估计输入的规模啊,这道题真的有毒啊
// 没事,继续加油吧~~~FIGHTING!
#include <cstdio>
#include <algorithm>
#include <iostream>
#include <cstring>
using namespace std;
const int MAX_NODE = 1001200;
struct Trie{
int ch[MAX_NODE][26];
int val[MAX_NODE];
int sz;
void init(){
sz = 1;
memset(ch[0],0,sizeof(ch[0]));
val[0] = 0;
}
int idx(char c){
return c - 'a';
}
void insert(char *s,int v){
int u = 0;
int n = strlen(s);
for (int i=0;i < n;i ++){
int c = idx(s[i]);
if (!ch[u][c]){
memset(ch[sz],0,sizeof(ch[sz]));
val[sz] = 0;
ch[u][c] = sz++;
}
u = ch[u][c];
}
val[u] = v;
}
int query(char *s){
int u = 0;
int n = strlen(s);
for (int i=0;i<n;i++){
int c = idx(s[i]);
if (!ch[u][c])
return 0;
u = ch[u][c];
}
return val[u];
}
}trie;
char str[30005];
char id[MAX_NODE][15];
int cnt ;
bool isapl(char c){
if (c >= 'a' && c <= 'z')
return true;
return false;
}
char p[4000];
int main(){
cnt = 1;
//freopen("1.txt","r",stdin);
trie.init();
while(gets(str)){
if (str[0]=='S') continue;
if (str[0]=='E') break;
int len = strlen(str);
char s1[30005];
int ind = 0;
for (int i= 0;i < len;i++){
if (!isapl(str[i])){
id[cnt][i] = 0;
ind = i+1;
break;
}
id[cnt][i] = str[i];
}
int x;
for (x=0;ind<len;x++,ind++){
s1[x] = str[ind];
}
s1[x++] = 0;
trie.insert(s1,cnt);
cnt++;
}
while(gets(p)){
if (p[0]=='S') continue;
if (p[0]=='E') break;
int len = strlen(p);
char st[6000];
int j = 0;
for (int i=0;i<len;i++){
//int j = i;
if (isapl(p[i])){
st[j++] = p[i];
}else {
st[j++] = 0;
int no = 0;
if (st[0]!=0){
no = trie.query(st);
if (no)
printf("%s",id[no]);
else{
printf("%s",st);
}
}
printf("%c",p[i]);
//memset(st,0,sizeof(st));
j=0;
}
}
printf("\n");
}
return 0;
}
hdu 1075 字典树
最新推荐文章于 2021-07-23 14:32:50 发布