• <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>
            付翔的專欄
            在鄙視中成長 記錄成長的點(diǎn)滴
            posts - 106,  comments - 32,  trackbacks - 0
            昨天斷網(wǎng) 博客沒有寫全 呵呵

            時(shí)間限制: 
            1000ms
             
            內(nèi)存限制: 
            131072kB
            描述
            在有道搜索框中,當(dāng)輸入一個(gè)或者多個(gè)字符時(shí),搜索框會(huì)出現(xiàn)一定數(shù)量的提示,如下圖所示:


            現(xiàn)在給你N個(gè)單詞和一些查詢,請(qǐng)輸出提示結(jié)果,為了簡化這個(gè)問題,只需要輸出以查詢?cè)~為前綴的并且按字典序排列的最前面的8個(gè)單詞,如果符合要求的單詞一個(gè)也沒有請(qǐng)只輸出當(dāng)前查詢?cè)~。
            輸入
            第一行是一個(gè)正整數(shù)N,表示詞表中有N個(gè)單詞。
            接下來有N行,每行都有一個(gè)單詞,注意詞表中的單詞可能有重復(fù),請(qǐng)忽略掉重復(fù)單詞。所有的單詞都由小寫字母組成。
            接下來的一行有一個(gè)正整數(shù)Q,表示接下來有Q個(gè)查詢。
            接下來Q行,每行有一個(gè)單詞,表示一個(gè)查詢?cè)~,所有的查詢?cè)~也都是由小寫字母組成,并且所有的單詞以及查詢的長度都不超過20,且都不為空
            其中:N<=10000,Q<=10000
            輸出
            對(duì)于每個(gè)查詢,輸出一行,按順序輸出該查詢?cè)~的提示結(jié)果,用空格隔開。
            樣例輸入
            10
            a
            ab
            hello
            that
            those
            dict
            youdao
            world
            your
            dictionary
            6
            bob
            d
            dict
            dicti
            yo
            z
            樣例輸出
            bob
            dict dictionary
            dict dictionary
            dictionary
            youdao your
            z









































































            用的是trie 樹
            #include <stdio.h>
            #include 
            <stdlib.h>
            #include 
            <string.h>
            #include 
            <iostream>
            #include 
            <string>
            #include 
            <vector>
            #include 
            <map>
            #include 
            <queue>
            #include 
            <algorithm>
            using namespace std;

            /*
            *
            */
            struct node{
                
            int next[26];// 對(duì)于某一層而言  next【i】 中i就表示該層有的字符了 next【i】的值指向他所指向的結(jié)構(gòu)
                int flag;// 用來標(biāo)記節(jié)點(diǎn)有沒有被使用
            }trie[210000];
            char str[100];
            char ans[100];
            int totle=1;
            void insert(){
                
            int p=0;
                
            int k=0;
                
            while(str[k]){
                    
            int v=str[k]-'a';
                    
            if(trie[p].next[v]==-1)trie[p].next[v]=totle++
                    p
            =trie[p].next[v];
                    k
            ++;
                }
                trie[p].flag
            =1;
            }
            int cur;
            void dfs(int k,int p)//此樹在組織的時(shí)候 就是按字典來排的 
            {
                
            if(cur>=8)return;
                
            if(trie[p].flag!=-1){
                    ans[k]
            =0;
                    
            if(cur==0)printf("%s",ans);
                    
            else printf(" %s",ans);
                    cur
            ++;
                }
                
            for(int i=0;i<26;i++)
                    
            if(trie[p].next[i]!=-1){
                        ans[k]
            =i+'a';
                        dfs(k
            +1,trie[p].next[i]);
                    }
                    
            return;
            }
            void find(){
                cur
            =0;
                
            int p=0,k=0;
                
            while(str[k]&&p!=-1)//比如 abc 按根開始 找到匹配 c 第三層的 P 
                {
                    p
            =trie[p].next[str[k]-'a'];
                    ans[k]
            =str[k];
                    k
            ++
                }
                
            if(p==-1)// 沒有匹配的 那么直接打印 按題意來
                {
                    printf(
            "%s\n",str);
                    
            return;
                }
                dfs(k,p);
            //繼續(xù)搜 str[k]個(gè)字符
                printf("\n");
            }
            int main() 
            {
                freopen(
            "in.txt","r",stdin);
                vector
            <string> my;
                
            int n;
                memset(trie,
            -1,sizeof(trie));
                scanf(
            "%d",&n);
                
            for(int i=0;i<n;i++){
                    scanf(
            "%s",str);
                    insert();
                }
                
            int q;
                scanf(
            "%d",&q);
                
            while(q--){
                    scanf(
            "%s",str);
                    find();
                }
                
            return 0;
            }


            同時(shí)還看到一位牛人 用stl 寫的 那個(gè)牛叉 也貼上了 以供自己參考

            using namespace std;

            string ts;

            bool issub(const string c)
            {
                
            if (ts.length() > c.length()) return false;
                
            return ts == c.substr(0, ts.length());//c字串中要存在ts 返回true
            }

            typedef vector
            <string> DIC;

            int main()
            {
                DIC dict;
                
            string str;
                size_t dsize, ssize;
                cin 
            >> dsize;
                dict.reserve(dsize);
            //確保dict 的容量至少為dsize
                for (size_t i = 0; i < dsize; ++i)
                {
                    cin 
            >> str;
                    dict.push_back(str);
                }
                std::sort(dict.begin(), dict.end());
            //排序
                dict.erase(std::unique(dict.begin(), dict.end()), dict.end());//去除重復(fù)的
                cin >> ssize;
                
            for (size_t i = 0; i < ssize; ++i)
                {
                    DIC::iterator iter;
                    cin 
            >> ts;
                    
            bool found = false;
                    iter 
            = lower_bound(dict.begin(), dict.end(),ts);
                    
            //此函數(shù)在msdn 的解釋為 在dict 中插入ts 最小的位置并維持序列有序
                    for(size_t j=0;j<8 && iter!=dict.end();++j,++iter)
                    {
                        
            if(issub(*iter)){
                            cout
            <<*iter<<" ";
                            found
            =true;
                        }
                    }
                    
            if (!found)
                        cout 
            << ts;
                    cout 
            << endl;
                }
                
            return 0;
            }

            posted on 2010-05-30 00:03 付翔 閱讀(322) 評(píng)論(0)  編輯 收藏 引用 所屬分類: ACM 數(shù)據(jù)結(jié)構(gòu)c++

            <2010年5月>
            2526272829301
            2345678
            9101112131415
            16171819202122
            23242526272829
            303112345

            常用鏈接

            留言簿(2)

            隨筆分類

            隨筆檔案

            文章分類

            文章檔案

            CSDN - 我的blog地址

            博客

            搜索

            •  

            最新評(píng)論

            閱讀排行榜

            評(píng)論排行榜

            91久久精品91久久性色| 久久久久久毛片免费播放| 精品熟女少妇aⅴ免费久久| 99久久精品免费| 日本高清无卡码一区二区久久| 中文字幕精品久久久久人妻| 久久久久亚洲AV成人网人人网站 | 亚洲精品乱码久久久久久蜜桃| 久久久无码精品亚洲日韩软件| 思思久久精品在热线热| 久久99精品久久久久久久不卡 | 香蕉久久久久久狠狠色| 久久综合久久自在自线精品自| 亚洲国产成人久久综合碰碰动漫3d| 久久久久无码中| 国产精品久久久久…| 久久人人爽人人澡人人高潮AV| 无码国内精品久久人妻蜜桃| 精品久久久久久无码国产| 欧洲成人午夜精品无码区久久| 久久久久99精品成人片牛牛影视| 婷婷五月深深久久精品| 亚洲日韩欧美一区久久久久我 | 亚洲午夜久久久久妓女影院| 久久九九久精品国产| 久久久久亚洲精品无码蜜桃| 久久天天躁狠狠躁夜夜2020老熟妇 | 成人久久免费网站| 大香网伊人久久综合网2020| 亚洲色欲久久久综合网东京热| 99久久国产综合精品麻豆| 欧美亚洲国产精品久久| 青青久久精品国产免费看| 国产AV影片久久久久久| 久久亚洲精品视频| 久久99热只有频精品8| 看久久久久久a级毛片| 伊人久久大香线蕉亚洲五月天| 久久久久久亚洲精品影院| 精品国产青草久久久久福利| 久久久无码精品亚洲日韩京东传媒|