• <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 閱讀(407) 評論(0)  編輯 收藏 引用 所屬分類: 字符串處理
            AV色综合久久天堂AV色综合在| 久久久久久极精品久久久| 久久国产精品无码网站| 秋霞久久国产精品电影院| 国产精品免费看久久久| 久久棈精品久久久久久噜噜| 欧洲人妻丰满av无码久久不卡| 久久久久久久波多野结衣高潮| 久久久久精品国产亚洲AV无码 | 97精品伊人久久大香线蕉app| 亚洲国产一成人久久精品| 日韩精品久久无码中文字幕| 精品熟女少妇av免费久久| 久久久久亚洲AV无码麻豆| 久久国产免费观看精品| 久久无码国产| 天天躁日日躁狠狠久久 | 青青国产成人久久91网| 国产巨作麻豆欧美亚洲综合久久 | 国产成人无码精品久久久久免费| 99久久精品无码一区二区毛片| 欧美777精品久久久久网| 久久综合九色欧美综合狠狠| 国产精品久久久久a影院| 99精品久久精品一区二区| 久久国产V一级毛多内射| 久久精品国产色蜜蜜麻豆| 久久久久久亚洲Av无码精品专口 | 国产福利电影一区二区三区,免费久久久久久久精| 99久久超碰中文字幕伊人| 久久久久一级精品亚洲国产成人综合AV区 | 国产美女亚洲精品久久久综合 | 无码人妻久久久一区二区三区| 精品久久久久久综合日本| 亚洲午夜无码AV毛片久久| 精品久久777| 久久夜色精品国产网站| 久久久久久久综合狠狠综合| 久久夜色精品国产亚洲| 久久精品aⅴ无码中文字字幕不卡 久久精品aⅴ无码中文字字幕重口 | 久久涩综合|