模板—trie图

Posted al-ca

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了模板—trie图相关的知识,希望对你有一定的参考价值。

做了某题之后发现trie的AC自动机太垃圾了,动不动就TLE,然后我就去学了trie图。

技术图片
#include<iostream>
#include<cstdio>
using namespace std;
struct trie

    int count;
    trie *fail,*nxt[26];
    trie()
    
        count=0;
        fail=NULL;
        for(int i=0;i<26;i++)nxt[i]=NULL;
    
*q[1000000],*root=new trie();
int head,tail;
char keyword[1000000],str[1000000];

void insert(char s[],trie *root)

    int i=0,index;
    trie *p=root;
    while(s[i])
    
        index=s[i]-a;
        if(p->nxt[index]==NULL)p->nxt[index]=new trie();
        p=p->nxt[index];
        i++;
    
    p->count++;

void build_ac(trie *root)

    q[++tail]=root;
    while(head!=tail)
    
        trie *p=q[++head];
        for(int i=0;i<26;i++)
        if(p->nxt[i]!=NULL)
        
            if(p==root)p->nxt[i]->fail=p;
            else       p->nxt[i]->fail=p->fail->nxt[i];
            q[++tail]=p->nxt[i];
        
        else
        
            if(p==root)p->nxt[i]=p;
            else       p->nxt[i]=p->fail->nxt[i];
        
    

int ask(trie *root)

    trie *p=root;
    int i=0,index,cnt=0;
    while(str[i])
    
        index=str[i]-a;
        p=p->nxt[index];
        trie *temp=p;
        while(temp!=root && temp->count!=-1)
            cnt+=temp->count,temp->count=-1,temp=temp->fail;
        i++;
    
    return cnt;

signed main()

    int n,T;
    trie *p;
    cin>>T;
    while(T--)
    
        p=new trie();
        cin>>n;
        for(int i=1;i<=n;i++)
        
            cin>>keyword;
            insert(keyword,p);
        
        cin>>str;
        build_ac(p);
        cout<<ask(p)<<endl;
    
View Code

 

以上是关于模板—trie图的主要内容,如果未能解决你的问题,请参考以下文章

Trie图 模板

Trie图/AC自动机

DNA Sequence POJ - 2778 邻接矩阵 trie图 矩阵快速幂

Trie树题目模板及java代码

模板——字典树Trie Tree

AC自动机