标签:
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!
解析:将词典中的原始单词组织成Trie,相应的对应单词作为原始单词的附加信息放到Trie树中原始单词的最后一个字符结点中。
AC代码:
//#include <bits/stdc++.h> //hdu的C++,不支持此头文件,G++支持
#include <cstdio>
#include <cstring>
#include <cctype>
using namespace std;
const int maxw = 12;
const int maxnode = 100000 * maxw + 10;
const int sigma_size = 26;
struct Trie{
int ch[maxnode][sigma_size];
char val[maxnode][maxw];
int sz;
void clear(){ sz = 1; memset(ch[0], 0, sizeof(ch[0])); }
int idx(char c){ return c - 'a'; }
void insert(const char *s, const char *v){
int u = 0, 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]));
ch[u][c] = sz++;
}
u = ch[u][c];
}
strcpy(val[u], v);
}
char* find(const char *s){
int u = 0, n = strlen(s);
int i;
char ans[maxw];
for(i=0; i<n; i++){
int c = idx(s[i]);
if(!ch[u][c]) return "";
u = ch[u][c];
}
return val[u];
}
};
Trie trie;
int main(){
#ifdef sxk
freopen("in.txt", "r", stdin);
#endif // sxk
trie.clear();
char s[maxw], ss[maxw], text[3002];
scanf("%s", s);
while(scanf("%s", s)){
if(s[0] == 'E' && s[1] == 'N' && s[2] == 'D') break;
scanf("%s", ss);
trie.insert(ss, s);
}
scanf("%s", s);
getchar();
while(gets(text)){
if(text[0] == 'E' && text[1] == 'N' && text[2] == 'D') break;
int n = strlen(text);
for(int i=0; i<n; ){
char foo[maxw];
int cnt = 0;
while(i < n && isalpha(text[i])){ foo[cnt ++] = text[i ++]; }
foo[cnt] = '\0';
if(!cnt){ putchar(text[i ++]); continue; }
if(strcmp(trie.find(foo), "")) printf("%s", trie.find(foo));
else printf("%s", foo);
}
puts("");
}
return 0;
}
版权声明:本文为博主原创文章,未经博主允许不得转载。
HDU 1075 What Are You Talking About (Trie)
标签:
原文地址:http://blog.csdn.net/u013446688/article/details/46909473