zoukankan      html  css  js  c++  java
  • 字典树模板

    #include<iostream>
    #include<string>
    
    using namespace std;
    
    //表示next数组的长度,表示26个字母。如果字符串中有其他字符的话,应相应调整。
    //如果所有的字符串都是手机号的话,那就是10了
    const int MAX_NUM = 26;
    struct trieNode{
        int i;//按需使用,本例子中表示从头到本字符组成的前缀出现的次数
        struct trieNode *next[MAX_NUM];
    };
    
    trieNode* CreateTrieNode(){
        trieNode *p = new trieNode;
        p->i = 1;
        for(int i = 0; i < MAX_NUM; i++)
            p->next[i] = NULL;
        return p;
    }
    void DelTrieTree(trieNode *p)
    {
        for(int i=0;i < MAX_NUM; i++)
        {
            if(p->next[i] != NULL)
                DelTrieTree(p->next[i]);
        }
        delete p;
    }
    void InsertTrieTree(trieNode **root, string str){
        trieNode *p;
        if(*root == NULL){
            p = CreateTrieNode();
            *root = p;
        }
        else
            p = *root;
        int len = str.length();
        int k;
        for(int i = 0; i < len; i++){
            k = str.at(i) - 'a';
            if(p->next[k] != NULL)
                p->next[k]->i += 1;
            else
                p->next[k] = CreateTrieNode();
            p = p->next[k];
        }
    }
    
    int SearchTrieTree(trieNode **root, string str){
        trieNode *p;
        if(*root == NULL)
            return 0;
        p = *root;
        int k, len = str.length();
        for(int i = 0; i < len; i++){
            k = str.at(i) - 'a';
            if(p->next[k] == NULL)
                return 0;
            p = p->next[k];
        }
        return p->i;
    }
    
    int main(){
        trieNode *root = NULL;
        InsertTrieTree(&root, "checking");
        InsertTrieTree(&root, "check");
        InsertTrieTree(&root, "for");
        InsertTrieTree(&root, "checking");
        InsertTrieTree(&root, "program");
        InsertTrieTree(&root, "programmer");
        InsertTrieTree(&root, "cheprogrammer");
        cout << SearchTrieTree(&root, "che") << endl;//输出3
        cout << SearchTrieTree(&root, "prog") << endl;//输出2
    }

    hdu2846该题字典树,在插入是把字符串分解成0到1到len的字符串后在插入。该题编译器需要选择C++,如果选择G++,内存过不了。笔者就是入了编译器的坑,浪费了半天时间在优化内存,结果发现C++编译器后直接就AC了。

    #include<iostream>
    #include<cstdio>
    #include<cstring>
    using namespace std;
    #define N (26)
    
    struct Node
    {
        int i;
        int k;
        Node* next[N];
        Node(int ik)
        {
            i = 1;
            k = ik;
            for(int j = 0;j<N;++j)
                next[j] = NULL;
        }
    
    };
    Node* root = NULL;
    void DelNode(Node* p)
    {
        if(p==NULL) return;
        for(int i=0;i<N;++i)    DelNode(p->next[i]);
        delete p;
        p = NULL;
    }
    void InsertNode(const char str[],int index)
    {
        Node* p = root;
        for(int i=0;i<strlen(str);++i)
        {
            int k = str[i] - 'a';
            if(p->next[k])
            {
                if(p->next[k]->k != index)
                {
                    ++p->next[k]->i;
                    p->next[k]->k = index;
                }
            }
            else
            {
                p->next[k] = new Node(index);
            }
            p = p->next[k];
        }
    }
    
    int SearchNode(const char str[])
    {
        Node *p = root;
        for(int i=0;i<strlen(str);++i)
        {
            int k = str[i] - 'a';
            if(p->next[k])  p = p->next[k];
            else    return 0;
        }
        return p->i;
    }
    
    int main()
    {
        int p,q;
        while(~scanf("%d",&p))
        {
            root = new Node(0);
            for(int i=0;i<p;++i)
            {
                char cstr[21];
                scanf("%s",cstr);
                int len = strlen(cstr);
                for(int j=0;j<len;++j)
                {
                    InsertNode(cstr+j,i);
                }
            }
            int q;
            scanf("%d",&q);
            char cstr2[21];
            for(int i=0;i<q;++i)
            {
                scanf("%s",cstr2);
                printf("%d
    ",SearchNode(cstr2));
            }
            DelNode(root);
    
        }
        return 0;
    }
    View Code

     hdu1251,该题编译器需要选择C++,不然内存有挂了。

    #include<iostream>
    #include<cstdio>
    #include<cstring>
    #include<cstdlib>
    using namespace std;
    #define N (26)
    struct Node
    {
        int i;
        Node* next[N];
        Node()
        {
            i = 1;
            for(int i=0;i<N;++i)
                next[i] = NULL;
        }
    };
    Node* root = new Node();
    void DelNode(Node* p)
    {
        if(p==NULL) return;
        for(int i=0;i<N;++i)
            DelNode(p->next[i]);
        delete p;
    }
    void InsertNode(char* str)
    {
        Node *p = root;
        for(int i=0;i<strlen(str);++i)
        {
            int k = str[i]-'a';
            if(p->next[k]) ++p->next[k]->i;
            else    p->next[k] = new Node();
            p = p->next[k];
        }
    }
    
    int SearchNode(char* str)
    {
        Node *p = root;
        for(int i=0;i<strlen(str);++i)
        {
            int k = str[i]-'a';
            if(p->next[k]) p = p->next[k];
            else return 0;
        }
        return p->i;
    }
    
    int main()
    {
        char str1[11],str2[11];
    
        while(gets(str1))
        {
            if(str1[0]==0) break;
            InsertNode(str1);
        }
    
        while(gets(str2))
        {
            printf("%d
    ",SearchNode(str2));
        }
    
        return 0;
    }
    View Code

    hdu1247,该题需要从单纯len=1到len-1遍历,并且需要判断是否是单词

    #include<iostream>
    #include<cstdio>
    #include<cstring>
    #include<vector>
    #include<string.h>
    using namespace std;
    #define N (26)
    
    
    struct Node
    {
        int i;
        Node* next[N];
        Node()
        {
            i = 1;
            for(int j=0;j<N;++j)
                next[j] = NULL;
        }
        void SetNext(const char c)
        {
            int k = c - 'a';
            if(next[k])     ++next[k]->i;
            else    next[k] = new Node();
        }
        Node* GetNext(const char c)
        {
            return next[c-'a'];
        }
    };
    
    Node *root = NULL;
    
    void InsertNode(char* str)
    {
        Node *p = root;
        int len = strlen(str);
        for(int i=0;i<len;++i)
        {
            p->SetNext(str[i]);
            p = p->GetNext(str[i]);
        }
    }
    
    int SearchNode(char* str)
    {
        Node *p = root;
        int len = strlen(str);
        for(int i=0;i<len;++i)
        {
            p = p->GetNext(str[i]);
            if(p==NULL) return 0;
        }
        //处理是否是单词
        int ti = 0;
        for(int i=0;i<N;++i)
            if(p->next[i])
            {
                ti += p->next[i]->i;
                if(ti == p->i) return 0;
            }
    
        return p->i;
    }
    
    void DelNode(Node *p)
    {
        if(p == NULL) return;
        for(int i=0;i<N;++i)
            DelNode(p->next[i]);
        delete p;
    }
    int main()
    {
        vector<string> vs;
        root = new Node();
        char str[50];
        while(~scanf("%s",str))
        {
            //if(strcmp(str,"ok")==0) break;
            vs.push_back(str);
            InsertNode(str);
        }
        int nSize = vs.size();
        for(int i=0;i<nSize;++i)
        {
            strcpy(str,vs[i].c_str());
            int len = strlen(str);
            for(int l1=1;l1<len-1;++l1)
            {
                int l2 = len-l1;
                char tc1[50]={''},tc2[50]={''};
                strncpy(tc1,str,l1);
                strncpy(tc2,str+l1,l2);
                if(SearchNode(tc1)&&SearchNode(tc2))
                {
                    printf("%s
    ",str);
                    break;
                }
            }
        }
        vs.clear();
        DelNode(root);
        return 0;
    }
    /*
    a
    ahat
    hat
    hatword
    hatshat
    hziee
    word
    ok
    */
    View Code
  • 相关阅读:
    牛客网 二叉树的镜像 JAVA
    牛客网 反转链表 JAVA
    牛客网 调整数组顺序使奇数位于偶数前面 JAVA
    Integer to Roman LeetCode Java
    Valid Number leetcode java
    Longest Common Prefix
    Wildcard Matching leetcode java
    Regular Expression Matching
    Longest Palindromic Substring
    Add Binary LeetCode Java
  • 原文地址:https://www.cnblogs.com/jlyg/p/7244864.html
Copyright © 2011-2022 走看看