HDU/HDOJ 1075 What Are You Talking About(字典树|STL map)
原文地址:http://www.wutianqi.com/?p=2467
题目传送门:http://acm.hdu.edu.cn/showproblem.php?pid=1075
这题用字典树Trie做很麻烦,用STL map要简单多了。
字典树的讲解;
http://www.wutianqi.com/?p=1359
这个是网上一位朋友的代码,分别是用字典树和map做的:
// 字典树 #include<iostream> #include<string> using namespace std; int i; struct dictree { dictree *child[26]; char engWord[11]; dictree()//初始化非常的有必要 { for(i=0;i<26;i++) child[i] = NULL; engWord[0]='\0'; } }; dictree root; void insert(char eng[],char mar[])//构建字典树 { dictree *now = &root; char *tmp = mar; while(*tmp) { if(now->child[*tmp-'a']==NULL) now->child[*tmp-'a'] = new dictree; now = now->child[*tmp-'a']; tmp++; } strcpy(now->engWord,eng); } char *find(char ch[])//查找单词 { dictree *p = &root; int k=0; while(1) { if(ch[k]=='\0' || p->child[ch[k]-'a']==NULL) break; p = p->child[ch[k]-'a']; k++; } if(ch[k]=='\0' && strcmp(p->engWord,"")!=0) return p->engWord; return NULL; } int main() { char a[11],b[11]; scanf("%s",a);//"START" while(scanf("%s",a) && strcmp(a,"END")!=0 ) { scanf("%s",b); insert(a,b); } scanf("%s",a);//"START" getchar();//吃回车 char tmp[3002]; while(1) { gets(tmp);//用这个比getline()强 if(strcmp(tmp,"END") == 0 ) break; int i,len,k=0; len = strlen(tmp); tmp[len]=' ';//多加一个' ',输出的时候注意 tmp[++len]='\0'; char tp[3002]; for(i=0;i<len;i++) { if(!(tmp[i]>='a' && tmp[i]<='z'))//非小写字母 { tp[k]='\0'; char *temp = find(tp);//查找是否有对应的engWord if(temp)//存在这个单词 printf("%s",temp); else printf("%s",tp);//可以用cout<<tp;//不可以用puts(tp);用puts有换行 k=0; if(i!=len-1)//最后有一个' '是多余的 cout<<tmp[i];//输出非小写字母字符 } else //小写字母 tp[k++]=tmp[i]; } cout<<endl; } return 0; }
STL map:
// STL map #include<iostream> #include<string> #include<map> using namespace std; map<string,string>M; int main() { string a,b; cin>>a;//"START" while(cin>>a && a!="END") { cin>>b; M[b] = a; } cin>>a;//"START" getchar();//吃回车 char tmp[3005]; while(1) { gets(tmp);//用这个比getline()强 if(strcmp(tmp,"END") == 0 ) break; int i,len; len = strlen(tmp); b = ""; for(i=0;i<len;i++) { if(!(tmp[i]>='a' && tmp[i]<='z'))//非小写字母 { if(M[b]!="")//存在这个单词 cout<<M[b]; else cout<<b; b=""; cout<<tmp[i]; } else //小写字母 b+=tmp[i]; } cout<<endl; } return 0; }