// 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; }
版权声明:本文为博主原创文章,未经博主允许不得转载。
原文地址:http://blog.csdn.net/timelimite/article/details/47256873