• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            gzwzm06

              C++博客 :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理 ::
              1 隨筆 :: 52 文章 :: 17 評論 :: 0 Trackbacks
            #include <stdio.h>
            #include 
            <string>
            #include 
            <algorithm>
            using namespace std ;

            struct WORD    
            {
                
            int ID ;    //模式串編號,處理重復
                WORD *next ;
            }
             ;

            const int MAXN = 100001 ;
            const int MAXM = 101 ;
            int N, M ;
            int match[MAXN] , num ;    //保存匹配結果
            char words[MAXM][25] ;

            WORD g_Temp[MAXN];
            int g_pos ;

            const int CAP = 28 ;
            typedef 
            struct NODE    //Trie 節點
            {    
                NODE()
                
            {
                    m_Pos.next 
            = NULL ;
                    current 
            = &m_Pos ;
                    memset(next, NULL, 
            sizeof(NODE));
                }
            ;
                NODE 
            *next[CAP];
                WORD m_Pos ;        
            //處理重復
                WORD *current ;
            }
            NODE;

            const int MEMORY = 30000 ;
            NODE memory[MEMORY] ;
            class BTree
            {
            public:
                BTree()
                
            {
                    index 
            = 1;
                    head 
            = &memory[0];
                }
                
                
            void Insert(char *str, const int& w)
                
            {
                    
            int len = (int)strlen(str);
                    NODE 
            *pt = head ;
                    
            for (int i = 0; i < len; ++i)
                    
            {
                        
            if ( str[i] == '*' )
                        
            {
                            
            if ( pt->next[26== NULL )
                            
            {
                                pt
            ->next[26= &memory[index++] ;
                            }

                            pt 
            = pt->next[26] ;        
                            
                        }

                        
            else if ( str[i] == '?' )
                        
            {
                            
            if ( pt->next[27== NULL )
                            
            {
                                pt
            ->next[27= &memory[index++] ;
                            }

                            
                            pt 
            = pt->next[27] ;
                        }

                        
            else {
                            
            if (pt->next[str[i]-'a'== NULL)
                            
            {
                                pt
            ->next[str[i]-'a'= &memory[index++];
                            }

                            
                            pt 
            = pt->next[str[i]-'a'];
                        }

                    }

                    
            //記錄模式串編號
                    if ( pt->m_Pos.next == NULL )
                        pt
            ->current = &pt->m_Pos ;
                    g_Temp[g_pos].ID 
            = w ;
                    g_Temp[g_pos].next 
            = NULL ;
                    pt
            ->current->next = &g_Temp[g_pos++] ;
                    pt
            ->current = pt->current->next ;
                    
                }

                
                
            void DFS( NODE *ptr, const int& pos , int w )
                
            {
                    
            if ( words[pos][w] == '\0' )
                    
            {
                        WORD 
            *= ptr->m_Pos.next ;
                        
            while ( p ){
                            match[num] 
            = p->ID ;
                            num
            ++ ;
                            p 
            = p->next ;
                        }


                        
            while ( ptr->next[26] )
                            ptr 
            = ptr->next[26] ;
                        p 
            = ptr->m_Pos.next ;
                        
            while ( p ){
                            match[num] 
            = p->ID ;
                            num
            ++ ;
                            p 
            = p->next ;
                        }

                        
            return ;
                    }

                    
            //遇到'*',將當前位置到結束符的字符一個一個匹配
                    if ( ptr->next[26!= NULL )
                    
            {
                        
            for ( int i = w ; i <= strlen(words[pos]) ; ++i )
                        
            {
                            DFS( ptr
            ->next[26], pos, i ) ;
                        }

                    }

                    
            //遇到'?'或字母,直接跳到下一個
                    if ( ptr->next[27!= NULL )
                    
            {
                        DFS( ptr
            ->next[27], pos, w + 1 ) ;
                    }

                    
            if ( ptr->next[words[pos][w] - 'a'!= NULL )
                    
            {
                        DFS( ptr
            ->next[words[pos][w] - 'a'], pos, w + 1 ) ;
                    }

                }

                
            public:
                NODE 
            *head;
                
            int index;
            }
            ;

            void Init()
            {
                g_pos 
            = 0 ;
            }


            int main()
            {    
                
            int i ;
                
            char tempstr[22] ;
                BTree trie ;
                scanf(
            "%d %d"&N, &M) ;
                Init() ;
                
                
            for ( i = 0 ; i < N ; ++i )
                
            {
                    scanf(
            "%s"&tempstr) ;
                    trie.Insert(tempstr, i) ;
                }

                
            for ( i = 0 ; i < M ; ++i )
                
            {
                    scanf(
            "%s"&words[i]) ;    
                    num 
            = 0 ;
                    trie.DFS( trie.head, i, 
            0 ) ;
                    
                    
            if ( num == 0 )
                    
            {
                        printf(
            "Not match\n") ;
                    }

                    
            else {
                        sort( match, match 
            + num ) ;
                        printf(
            "%d ", match[0]) ;
                        
            for ( int j = 1 ; j < num ; ++j )
                        
            {
                            
            if ( match[j] != match[j - 1] )
                                printf(
            "%d ", match[j]) ;
                        }

                        printf(
            "\n") ;
                    }

                }

                
                
            return 0 ;
            }
            posted on 2008-11-09 17:05 閱讀(414) 評論(0)  編輯 收藏 引用 所屬分類: 字符串處理
            一级做a爰片久久毛片16| 伊人久久精品影院| 国产精品无码久久久久| 久久久久亚洲av毛片大 | 97精品依人久久久大香线蕉97| 久久综合亚洲色HEZYO社区| 亚洲AV成人无码久久精品老人 | 国产精久久一区二区三区| 国内精品久久久久久不卡影院| 国产精品久久新婚兰兰| 国产高潮国产高潮久久久| 一本色道久久88综合日韩精品 | 99久久精品国内| 久久er国产精品免费观看2| 久久精品国产91久久综合麻豆自制| 久久精品水蜜桃av综合天堂| 久久国产色AV免费看| 亚洲国产精品久久66| 精品人妻伦一二三区久久| 午夜视频久久久久一区| 久久精品国产亚洲αv忘忧草| 天天爽天天狠久久久综合麻豆| 久久夜色精品国产欧美乱| 99久久精品国产一区二区蜜芽| 久久久久国色AV免费观看| 国产精品成人久久久| 国产精品99久久99久久久| 精品国产综合区久久久久久| 久久久久se色偷偷亚洲精品av| 久久精品黄AA片一区二区三区| 嫩草影院久久国产精品| 久久综合久久性久99毛片| 久久精品一本到99热免费| 久久久久国产亚洲AV麻豆| 无码人妻精品一区二区三区久久久 | 亚洲国产成人精品久久久国产成人一区二区三区综 | 国产99久久久国产精品~~牛| 久久伊人精品一区二区三区| www.久久99| 久久99精品久久久大学生| 国产亚州精品女人久久久久久|