标签:
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