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 }
原文地址:https://www.cnblogs.com/yewei/p/2625745.html