后缀自动机模板(计蒜客24852题)

#include
#define N 100005
#define P pair
using namespace std;
typedef long long ll;
const int M=1e9+7;
const int inf=1e9+7;
char s[N];
int cur=1,cnt=1,last,ch[N*2][27],fa[N*2],dis[N*2],sg[N*2],mark[N*2][27];
void build(int c,int id){
    last=cur;cur=++cnt;
    int p=last;dis[cur]=id;
    for(;p && !ch[p][c];p=fa[p])ch[p][c]=cur;
    if(!p)fa[cur]=1;
    else{
        int q=ch[p][c];
        if(dis[q]==dis[p]+1)fa[cur]=q;
        else{
            int nt=++cnt;dis[nt]=dis[p]+1;
            memcpy(ch[nt],ch[q],sizeof(ch[q]));
            fa[nt]=fa[q];fa[q]=fa[cur]=nt;
            for(;ch[p][c]==q;p=fa[p])ch[p][c]=nt;
        }
    }
}
void dfs(int root)
{
    //printf("%d\n",root);
    for(int i=0;i<26;i++){
        if(!ch[root][i])continue;
        if(sg[ch[root][i]]==-1)dfs(ch[root][i]);
        mark[root][sg[ch[root][i]]]=1;
    }
    for(int i=0;i<27;i++)
        if(mark[root][i]==0)
        {
            sg[root]=i;
            break;
        }
}
int query()
{
    int n=strlen(s);
    int now=1;
    for(int i=0;i

你可能感兴趣的:(后缀自动机)