1. 程式人生 > >HDU1075 字典樹板子題

HDU1075 字典樹板子題

題意 :給出兩組字串 一一對映,給出一種組成的文字,要求對映成另外一種
思路:使用字典樹,把對映的另外一個字元存在字典樹的單詞節點處  例如 abc   123

則把123存在abc節點中的c處即可

同時這裡使用的是靜態的陣列,操作和寫起來都更方便,就是要提前判斷開的空間,過大過小都會有莫名其妙的錯誤

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cstring>
 4 using namespace std;
 5 const int maxn=5e5+5
; 6 const int size=26; 7 struct Trie{ 8 int ch[maxn][size]; 9 char str[maxn][20]; 10 bool isEnd[maxn]; 11 int size; 12 void init(){ 13 size=1; 14 memset(ch,0,sizeof(ch)); 15 memset(isEnd,0,sizeof(isEnd)); 16 } 17 int index(char s){ 18 return
s-'a'; 19 } 20 void insert(char*s1,char*s2){ 21 int i,rt; 22 for(i=rt=0;s1[i]!='\0';i++){ 23 int c=index(s1[i]); 24 if(ch[rt][c]==0){ 25 ch[rt][c]=size++; 26 } 27 rt=ch[rt][c]; 28 } 29 strcpy(str[rt],s2);
30 isEnd[rt]=1; 31 } 32 const char*find(char*s){ 33 int i,rt; 34 for(i=rt=0;s[i]!='\0';i++){ 35 int c=index(s[i]); 36 if(!ch[rt][c])return "0"; 37 rt=ch[rt][c]; 38 } 39 return (isEnd[rt])?str[rt]:"0"; 40 41 } 42 }trie; 43 char s1[maxn],s2[maxn]; 44 int main(){ 45 trie.init(); 46 while(scanf("%s",s1)==1){ 47 if(!strcmp(s1,"START"))continue; 48 if(!strcmp(s1,"END"))break; 49 scanf("%s",s2); 50 trie.insert(s2,s1); 51 } 52 //cout<<111<<endl; 53 getchar(); 54 while(gets(s1)){ 55 if(!strcmp(s1,"START"))continue; 56 if(!strcmp(s1,"END"))break; 57 int i=0; 58 while(s1[i]!='\0'){ 59 if(s1[i]>='a'&&s1[i]<='z'){ 60 int j=0; 61 while(s1[i]!='\0'&&s1[i]>='a'&&s1[i]<='z'){ 62 s2[j++]=s1[i++]; 63 } 64 s2[j]='\0'; 65 const char*temp=trie.find(s2); 66 if(temp[0]=='0')printf("%s",s2); 67 else printf("%s",temp); 68 } 69 else putchar(s1[i++]); 70 // puts(""); 71 } 72 // puts(""); 73 cout<<endl; 74 } 75 return 0; 76 }