HDOJ 1075 -- What Are You Talking About Trie( STL )
原创
转载请注明:www.cnblogs.com/yewei
方法一:Trie
思路:
1. 开辟一个结构体数组dict,数组中存放索引值和索引,比如from fiwo
2. 建立一颗Trie,Trie维护 整型变量 index,结构体指针数组 branch,在建立Trie的过程中,若是单词结尾,Trie中index赋值为dict的索引,否则为-1
写法一:string类降低编码复杂度,当然代价是时间复杂度加大约 2 倍
View Code
1 /* 2 PROG: What Are You Talking About 3 ID : yewei 4 LANG: C++ 5 */ 6 #include <map> 7 #include <string> 8 #include <cstdio> 9 #include <cstdlib> 10 #include <cstring> 11 #include <iostream> 12 #include <memory.h> 13 #include <algorithm> 14 using namespace std; 15 16 struct Dictionary 17 { 18 string front, back; 19 }dict[500004]; 20 21 struct Trie_Node 22 { 23 int index; 24 Trie_Node *branch[27]; 25 Trie_Node(): index( -1 ) 26 { 27 memset( branch, 0, sizeof(branch) ); 28 } 29 }; 30 class Trie 31 { 32 public: 33 Trie(); 34 ~Trie() { } 35 void Trie_Insert( int k, string ss ); 36 int Trie_Find( string ss ); 37 38 private: 39 Trie_Node *root; 40 }t; 41 42 /* Valiable */ 43 int M=0; 44 45 Trie::Trie() 46 { 47 root = new Trie_Node(); 48 }// Trie 49 50 void Trie::Trie_Insert( int k, string ss ) 51 { 52 Trie_Node *ptr = root; 53 int slen = ss.length(); 54 for ( int i=0; i<slen; ++i ) 55 { 56 if ( ptr->branch[ ss[i]-'a' ]==NULL ) 57 { 58 Trie_Node *temp = new Trie_Node(); 59 ptr->branch[ ss[i]-'a' ] = temp; 60 } 61 62 ptr = ptr->branch[ ss[i]-'a' ]; 63 } 64 65 ptr->index = k; 66 }// Trie_Insert 67 68 int Trie::Trie_Find( string ss ) 69 { 70 Trie_Node *ptr = root; 71 int slen = ss.length(); 72 for ( int i=0; i<slen; ++i ) 73 { 74 if ( ptr->branch[ ss[i]-'a' ]!=NULL ) 75 ptr = ptr->branch[ ss[i]-'a' ]; 76 else 77 return -1; 78 } 79 80 return ptr->index; 81 }// Trie_Find 82 83 void ReadData() 84 { 85 string s1, s2; 86 87 cin >> s1; // Words " START " 88 while ( cin >> s1 && s1!="END" ) 89 { 90 cin >> s2; 91 dict[M].front = s1; 92 dict[M].back = s2; 93 94 t.Trie_Insert( M++, s2 ); // Note " M++ " 95 }// dictionary 96 }// ReadData 97 98 void Solve() 99 { 100 int slen, kk; 101 string words, line; 102 103 cin >> line; // Words " START " 104 getchar(); 105 while ( getline( cin, line ) && line!="END" ) 106 { 107 words = ""; 108 slen = line.length(); 109 for ( int i=0; i<slen; ++i ) 110 { 111 if ( isalpha( line[i] ) ) 112 { 113 words += line[i]; 114 } 115 else 116 { 117 kk = t.Trie_Find( words ); 118 if ( kk==-1 ) 119 cout << words; 120 else 121 cout << dict[kk].front; 122 cout << line[i]; 123 124 words = ""; 125 } 126 }// scanning 127 128 cout << endl; 129 }// books 130 }// Solve 131 132 int main() 133 { 134 ReadData(); 135 Solve(); 136 137 return 0; 138 }
写法二:C语言的写法,编码复杂度加大,时间复杂度尚可,250MS
View Code
1 /* 2 PROG: What Are You Talking About 3 ID : ouyangyewei 4 LANG: C++ 5 */ 6 #include <map> 7 #include <string> 8 #include <cstdio> 9 #include <cstdlib> 10 #include <cstring> 11 #include <iostream> 12 #include <memory.h> 13 #include <algorithm> 14 using namespace std; 15 16 const int maxn = 15; 17 18 struct Dictionary 19 { 20 char front[maxn]; 21 char back[maxn]; 22 }dict[500004]; 23 24 struct Trie_Node 25 { 26 int index; 27 Trie_Node *branch[27]; 28 Trie_Node(): index( -1 ) 29 { 30 memset( branch, 0, sizeof(branch) ); 31 } 32 }; 33 class Trie 34 { 35 public: 36 Trie(); 37 ~Trie() { } 38 void Trie_Insert( int k, char ss[] ); 39 int Trie_Find( char ss[] ); 40 41 private: 42 Trie_Node *root; 43 }t; 44 45 /* Valiable */ 46 int M=0; 47 48 Trie::Trie() 49 { 50 root = new Trie_Node(); 51 }// Trie 52 53 void Trie::Trie_Insert( int k, char ss[] ) 54 { 55 Trie_Node *ptr = root; 56 int slen = strlen( ss ); 57 for ( int i=0; i<slen; ++i ) 58 { 59 if ( ptr->branch[ ss[i]-'a' ]==NULL ) 60 { 61 Trie_Node *temp = new Trie_Node(); 62 ptr->branch[ ss[i]-'a' ] = temp; 63 } 64 65 ptr = ptr->branch[ ss[i]-'a' ]; 66 } 67 68 ptr->index = k; 69 }// Trie_Insert 70 71 int Trie::Trie_Find( char ss[] ) 72 { 73 Trie_Node *ptr = root; 74 int slen = strlen( ss ); 75 for ( int i=0; i<slen; ++i ) 76 { 77 if ( ptr->branch[ ss[i]-'a' ]!=NULL ) 78 ptr = ptr->branch[ ss[i]-'a' ]; 79 else 80 return -1; 81 } 82 83 return ptr->index; 84 }// Trie_Find 85 86 void ReadData() 87 { 88 char s1[maxn], s2[maxn]; 89 90 scanf("%s", &s1); // Words " START " 91 while ( EOF!=scanf("%s", s1), strcmp(s1, "END")!=0 ) 92 { 93 scanf("%s", &s2); 94 strcpy( dict[M].front, s1 ); 95 strcpy( dict[M].back, s2 ); 96 97 t.Trie_Insert( M++, s2 ); // Note " M++ " 98 }// dictionary 99 }// ReadData 100 101 void Solve() 102 { 103 int slen, tlen, kk; 104 char words[maxn], line[3004]; 105 106 scanf("%s", line); // Words " START " 107 getchar(); 108 while ( gets( line ), strcmp( line, "END" )!=0 ) 109 { 110 tlen = 0; 111 slen = strlen( line ); 112 memset( words, 0, sizeof(words) ); 113 114 for ( int i=0; i<slen; ++i ) 115 { 116 if ( isalpha( line[i] ) ) 117 { 118 words[ tlen++ ] = line[i]; 119 } 120 else 121 { 122 kk = t.Trie_Find( words ); 123 if ( kk==-1 ) 124 printf("%s", words); 125 else 126 printf("%s", dict[kk].front); 127 printf("%c", line[i]); 128 129 tlen = 0; 130 memset( words, 0, sizeof(words) ); 131 } 132 }// scanning 133 134 printf("\n"); 135 }// books 136 }// Solve 137 138 int main() 139 { 140 ReadData(); 141 Solve(); 142 143 return 0; 144 }
方法二:STL MAP
编码复杂度低,时间复杂度差
View Code
1 /* 2 PROG: What Are You Talking About 3 ID : ouyangyewei 4 LANG: C++ 5 */ 6 #include <map> 7 #include <string> 8 #include <cstdio> 9 #include <cstdlib> 10 #include <cstring> 11 #include <iostream> 12 #include <memory.h> 13 #include <algorithm> 14 using namespace std; 15 16 int slen; 17 string s1, s2, line, result; 18 map <string, string> data; 19 20 int main() 21 { 22 cin >> s1; // START 23 while ( cin >> s1, s1!="END" ) 24 { 25 cin >> s2; 26 data[ s2 ] = s1; 27 }// dictionary 28 29 cin >> s1; 30 getchar(); // fetch carry reture 31 while ( getline( cin, line ) && line!="END" ) 32 { 33 result = ""; 34 slen = line.length(); 35 for ( int i=0; i<slen; ++i ) 36 { 37 if ( isalpha( line[i] ) ) 38 { 39 result += line[i]; 40 } 41 else 42 { 43 if ( data[ result ]=="" ) 44 cout << result; 45 else 46 cout << data[ result ]; 47 cout << line[i]; 48 49 result = ""; 50 } 51 }// scanning 52 53 cout << endl; 54 }// books 55 56 return 0; 57 }