模板—AC自动机

时间:2019-11-14
本文章向大家介绍模板—AC自动机,主要包括模板—AC自动机使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

复习了一下板子。

指针实现占内存比较大,要是卡内存就恶心了……

指针实现:

struct AC
{
    struct trie
    {
        trie *nxt[94],*fail;
        short inc,ct;
        trie(){for(int i=0;i<94;i++)nxt[i]=NULL;fail=NULL;inc=0;ct=0;}
    }*root=new trie();
    queue<trie*>q;vector<short>al;
    void insert(char *s,int id)
    {
        trie *p=root;int n=strlen(s);
        for(int i=0;i<n;i++)
        {
            if(p->nxt[s[i]-' ']==NULL)p->nxt[s[i]-' ']=new trie();
            p=p->nxt[s[i]-' '];
        }p->inc=id;
    }
    void build()
    {    
        q.push(root);
        while(!q.empty())
        {
            trie *p=q.front();q.pop();
            for(int i=0;i<94;i++)
            if(p->nxt[i])
            p->nxt[i]->fail=(p==root?p:p->fail->nxt[i]),q.push(p->nxt[i]);
            else p->nxt[i]=(p==root?p:p->fail->nxt[i]);
        }
    }
    void ask(char *s,int tim)
    {
        al.clear();int n=strlen(s);trie *p=root;
        for(int i=0;i<n;i++)
        {    
            p=p->nxt[s[i]-' '];
            trie *tmp=p;
            while(tmp!=root&&tmp->ct!=tim)
            {
                if(tmp->inc)al.push_back(tmp->inc);
                tmp->ct=tim;tmp=tmp->fail;
            }
        }    
    }
}T;

数组实现:

struct AC
{
	int nxt[100000][130],fail[100000],inc[100000],ct[100000];
	int cnt=1,root=1;
	queue<int>q;vector<short>al;
	void insert(char *s,int id)
	{
		int p=root;int n=strlen(s);
		for(int i=0;i<n;i++)
		{
			if(nxt[p][s[i]-' ']==0)nxt[p][s[i]-' ']=++cnt;
			p=nxt[p][s[i]-' '];
		}inc[p]=id;
	}
	void build()
	{	
		q.push(root);
		while(!q.empty())
		{
			int p=q.front();q.pop();
			for(int i=0;i<94;i++)
			if(nxt[p][i])
			fail[nxt[p][i]]=(p==root?p:nxt[fail[p]][i]),q.push(nxt[p][i]);
			else nxt[p][i]=(p==root?p:nxt[fail[p]][i]);
		}
	}
	void ask(char *s,int tim)
	{
		al.clear();int n=strlen(s);int p=root;
		for(int i=0;i<n;i++)
		{	
			p=nxt[p][s[i]-' '];
			int tmp=p;
			while(tmp!=root&&ct[tmp]!=tim)
			{
				if(inc[tmp])al.push_back(inc[tmp]);
				ct[tmp]=tim;tmp=fail[tmp];
			}
		}	
	}
}T;

原文地址:https://www.cnblogs.com/Al-Ca/p/11856120.html