zoukankan      html  css  js  c++  java
  • 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 }
  • 相关阅读:
    PAT (Basic Level) Practise 1013 数素数
    PAT (Basic Level) Practise 1014 福尔摩斯的约会
    codeforces 814B.An express train to reveries 解题报告
    KMP算法
    rsync工具
    codeforces 777C.Alyona and Spreadsheet 解题报告
    codeforces 798C.Mike and gcd problem 解题报告
    nginx + tomcat多实例
    MongoDB副本集
    指针的艺术(转载)
  • 原文地址:https://www.cnblogs.com/yewei/p/2630259.html
Copyright © 2011-2022 走看看