码迷,mamicode.com
首页 > 其他好文 > 详细

别人的后缀自动机

时间:2019-07-23 13:32:12      阅读:67      评论:0      收藏:0      [点我收藏+]

标签:lse   efi   code   private   namespace   nod   sign   后缀   void   

#include<bits/stdc++.h>
#define fi first
#define se second
#define INF 0x3f3f3f3f
#define LNF 0x3f3f3f3f3f3f3f3f
#define fio ios::sync_with_stdio(false);cin.tie(0);cout.tie(0)
#define pqueue priority_queue
#define NEW(a,b) memset(a,b,sizeof(a))
const double pi=4.0*atan(1.0);
const double e=exp(1.0);
const int maxn=4e5+8;
typedef long long LL;
typedef unsigned long long ULL;
const LL mod=1e9+7;
const ULL base=1e7+7;
const int maxp=26+5;
using namespace std;
struct Suffix_Node{
    int ch[maxp],par,len;
    void init(){
        NEW(ch,0);
        par=len=0;
    }
};
class Suffix_Automation{
private:
    Suffix_Node s[maxn];
    int cur,las,siz,crp;
public:
    Suffix_Automation():las(1),cur(1),siz(1),crp(1){}
    const void init(){
        for(int i=0;i<=siz;i++) s[i].init();
        las=cur=siz=crp=1;
    }
    const int match(const char c)const{
        return s[crp].ch[c-a];
    }
    const void withdraw(const int len){
        while(crp!=0&&s[s[crp].par].len>=len) crp=s[crp].par;
        if(crp==0) crp=1;
    }
    const void Transfer(const int len,const char c){
        crp=s[crp].ch[c-a];
        if(crp==0) crp=1;
        withdraw(len);
    }
    const void ex_tend(const char c){//扩展新字符
        int x=c-a;
        cur=++siz;
        s[cur].len =s[las].len+1;
        while(las!=0&&!s[las].ch[x])
            s[las].ch[x]=cur,las=s[las].par;
        if(las==0) s[cur].par=1;
        else{
            int q,nq;
            q=s[las].ch[x];
            if(s[q].len==s[las].len+1)
                s[cur].par=q;
            else{
                nq=++siz;
                s[nq]=s[q],s[nq].len=s[las].len+1;
                s[cur].par=s[q].par=nq;
                while(las!=0&&s[las].ch[x]==q)
                    s[las].ch[x]=nq,las=s[las].par;
            }
        }
        las=cur;
    }

}SAM;

 

别人的后缀自动机

标签:lse   efi   code   private   namespace   nod   sign   后缀   void   

原文地址:https://www.cnblogs.com/Profish/p/11231000.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!