• UVA 11488 Hyper Prefix Sets 字典树


    模板题,字典树最基本的操作

    在看别人的板子的时候学到了一点小技巧

    下面贴AC代码,顺便补一补字典树相关

    Trie三兄弟——标准Trie、压缩Trie、后缀Trie

    字符串模式匹配算法——BM、Horspool、Sunday、KMP、KR、AC算法一网打尽

    #include<bits/stdc++.h>  
    using namespace std;
    const int MAX = 5e4 + 5;
    string s;
    int n, t, ans;
    struct Trie {
        Trie *next[2];
        int vis;
        Trie()   //这个方法开节点很方便的,码一下
        {
            for (int i = 0; i<2; i++)
                this->next[i] = NULL;
            this->vis = 0;
        }
    };
    void insertrie(Trie* rt, string s)
    {
        int len = s.length();
        Trie *p = rt;
        for (int i = 0; i<len; i++)
        {
            int id = s[i] - '0';
            if (p->next[id] == NULL)
            {
                p->next[id] = new Trie;
            }
            p = p->next[id];
            p->vis++;
            ans = max(ans, (i+1)*p->vis);
        }
    }
    int main()
    {
        cin >> t;
        while (t--)
        {
            cin >> n;
            ans = 0;
            Trie *rt=new Trie;
            for (int i = 0; i<n; i++)
            {
                cin >> s;
                insertrie(rt, s);
            }
            cout << ans << endl;
        }
        return 0;
    }

     小笔记♪(^∇^*)

    背景+定义:字典树进行推广实际上是一个N叉树,字典树相对比较简单,但重要的是在此基础上的AC自动机比较难。字典树的功能实际上是对于很多的串进行压缩。

    板子:

    #include<bits/stdc++.h>
    using namespace std;
    const int ALTN=26;
    string s;
    int n;
    struct Node{
     Node *nxt[ALTN];
     int flag;
     Node()
     {
         for(int i=0;i<ALTN;i++)
            nxt[i]=NULL;
         flag=0;  //flag的相关应用是难点的感觉?
     }
    };
    Node *rt;
    void init()
    {
        rt=new Node();
    }
    void insertrie(string s)
    {
        int len=s.length();
        Node *p=rt;
        for(int i=0;i<len;i++)
        {
            int id=s[i]-'a';
            if(p->nxt[id]==NULL)
                p->nxt[id]=new Node();
            p=p->nxt[id];
        }
        p->flag++;
    }
    int findtrie(string s)  //查找字符串个数
    {
        int len =s.length();
        Node *p=rt;
        for(int i=0;i<len;i++)
        {
            int id= s[i]-'a';
            if(p->nxt[id]==NULL) return 0;
            p=p->nxt[id];
        }
        return p->flag;
    }
    int dealtrie(Node *p)
    {
        int i;
        if(p==NULL) return 0;
        for(int i=0;i<ALTN;i++)
        {
            if(p->nxt[i]!==NULL)
                dealtrie(p->nxt[i]);
        }
        free(p);
        return 0;
    }
  • 相关阅读:
    我与ARM的那些事儿1初识ARM
    WP的万能小应用时钟表
    单片机的模拟智能灌溉系统
    android的计算器
    C语言经典面试题目(转的,不过写的的确好!)
    数据库sqlite3在linux中的使用
    认识域模型
    认识JMS
    认识JDOM
    认识RMI
  • 原文地址:https://www.cnblogs.com/Egoist-/p/8361609.html
Copyright © 2020-2023  润新知