字典树
本题大意为先给你一个火星文字典,里面对应的每一个国兴文字对应一个地球文字,然后给出一串火星文字,要求你将其翻译成地球文,在字典中找不到的文字按原样输出
直接用简单的字典树处理
但要注意一些特殊的数据.如
START
a b
c d
ab cd
ac ef
ef ab
END
START
abcd abcd ef ac
END
wrong output
ef ef ac ac
还有一种是:START
from fiwo
hello difh
trap dif
mars riwosf
earth fnnvk
like fiiwj
END
START
difh, i'm fiwo riwosf.
i fiiwj fnnvk! dif fnn
END
1、即某个关键字是另一个关键字的前缀的,别忘了处理这种情况,因为这里贡献了好几次WA
2、以某个关键字的前缀出现,但是字典里不是一个关键字的,如上面的fnn是fnnvk的前缀
#include<iostream> #include<cstdio> #include<cstring> #include<algorithm> using namespace std; typedef struct node{ int flag; char s[15]; struct node *next[26]; } Trie; void insertTrie(Trie *root,char *c,char *e){ if(root==NULL||*c=='\0') return; Trie *p = root; while(*c!='\0'){ if(p->next[*c-'a']==NULL){ Trie *q = (Trie*)malloc(sizeof(Trie)); q->flag=0; memset(q->s,'\0',sizeof(q->s)); for(int i=0; i<26; i++){ q->next[i]=NULL; } p->next[*c-'a']=q; p=p->next[*c-'a']; } else{ p=p->next[*c-'a']; } c++; } p->flag=1; strcpy(p->s,e); } void searchTrie(Trie *root,char *c){ Trie *p = root; char *k=c;//将传入的字符串指针赋给k while(p!=NULL&&*k!='\0'){ if(p->next[*k-'a']!=NULL){ p=p->next[*k-'a']; k++; } else{ printf("%s",c);//输出传入的字符串 return; } } if(p->flag==1){ printf("%s",p->s);//输出字典树该位置的字符串 } else{ printf("%s",c);//输出传入的字符串 } } int main(){ Trie *root = (Trie*)malloc(sizeof(Trie));//初始化字典树根节点 root->flag=0; memset(root->s,'\0',sizeof(root->s)); for(int i=0; i<26; i++){ root->next[i]=NULL; } char start[10]; char earth[15],mar[15]; char lang[4000]; char ss[15]; scanf("%s",start); while(1){ scanf("%s",earth); if(strcmp(earth,"END")==0) break; scanf("%s",mar); insertTrie(root,mar,earth); } scanf("%s",start); getchar(); while(1){ gets(lang); if(strcmp(lang,"END")==0) break; int j=0; for(int i=0; i<strlen(lang); i++){ if(lang[i]>='a'&&lang[i]<='z') ss[j++]=lang[i]; else{ searchTrie(root,ss); printf("%c",lang[i]); j=0; memset(ss,'\0',sizeof(ss));//初始化ss字符串数组 } if(i==strlen(lang)-1){ searchTrie(root,ss); break; } } printf("\n"); } return 0; }