USACO 2.3.1 Longest Prefix --- Trie
View Code
1 /* 2 PROG: prefix 3 ID : ouyangyewei 4 LANG: C++ 5 */ 6 #include <string.h> 7 #include <cstdio> 8 #include <cstdlib> 9 #include <cstring> 10 #include <iostream> 11 #include <memory.h> 12 #include <algorithm> 13 using namespace std; 14 15 struct Trie_Node 16 { 17 bool IsEnd; 18 Trie_Node *branch[26]; 19 Trie_Node(): IsEnd( false ) 20 { 21 memset( branch, 0, sizeof(branch) ); 22 }// Init 23 }; 24 25 class Trie 26 { 27 public: 28 Trie(); 29 void Trie_Insert( char tt[] ); 30 void Trie_Find( long j ); 31 32 private: 33 Trie_Node *root; 34 }t; // type class "Trie" object t 35 36 long slen; 37 bool prefix[200400]; 38 char line[204], ss[200400]; 39 40 Trie::Trie() 41 { 42 root = new Trie_Node(); 43 }// Trie 44 45 void Trie::Trie_Insert( char tt[] ) 46 { 47 Trie_Node *ptr = root; 48 int tlen = strlen( tt ); 49 for ( int i=0; i<tlen; ++i ) 50 { 51 if ( ptr->branch[ tt[i]-'A' ]==NULL ) 52 { 53 Trie_Node *tmp = new Trie_Node(); 54 ptr->branch[ tt[i]-'A' ] = tmp; 55 } 56 57 ptr = ptr->branch[ tt[i]-'A' ]; 58 } 59 60 ptr->IsEnd = true; 61 }// Trie_Insert 62 63 void ReadData() 64 { 65 while ( gets( line ) ) 66 { 67 if ( line[0]=='.' ) break; 68 69 char *tok = strtok( line, " " ); 70 while ( tok ) 71 { 72 t.Trie_Insert( tok ); 73 //printf("%s\n", tok); 74 tok = strtok( NULL, " " ); 75 }// Insert 76 } 77 78 char str[204]; 79 while ( gets( str ) ) 80 { 81 strcat( ss, str ); 82 } 83 84 slen = strlen( ss ); 85 86 return ; 87 }// ReadData 88 89 void Trie::Trie_Find( long j ) 90 { 91 Trie_Node *ptr = root; 92 for ( ; ; ++j ) 93 { 94 ptr = ptr->branch[ ss[j]-'A' ]; 95 if ( ss[j]=='\0' || ptr==NULL ) 96 return ; 97 if ( ptr->IsEnd ) 98 prefix[ j+1 ]=true; 99 } 100 101 return ; 102 }// Trie_Find 103 104 void Solve() 105 { 106 prefix[0] = true; 107 for ( long i=0; i<slen; ++i ) 108 { 109 if ( !prefix[i] ) continue; 110 111 t.Trie_Find( i ); 112 }// Searching 113 114 int result; 115 for ( result=slen; !prefix[result]; --result ); 116 printf("%d\n", result); 117 118 return ; 119 }// Solve 120 121 int main() 122 { 123 freopen("prefix.in", "r", stdin); 124 freopen("prefix.out", "w", stdout); 125 126 ReadData(); 127 Solve(); 128 129 // system("pause"); 130 return 0; 131 }