【BZOJ 4516】 [Sdoi2016]生成魔咒 后缀自动机

来源:互联网 发布:php get object vars 编辑:程序博客网 时间:2024/05/23 05:07

可以拿来练一下版

#include<cstdio>#include<cstring>#include<iostream>#include<map>#define maxn 250020*2#define LL long longusing namespace std;int n,fail[maxn],len[maxn],tot,last,rt;LL ans;map<int,int>son[maxn]; void insert(int x){    int p=last,np=++tot,q,nq;    len[np]=len[p]+1;    while(p&&!son[p][x]){        son[p][x]=np;p=fail[p];    }    if(p==0)fail[np]=rt;    else{        q=son[p][x];        if(len[q]==len[p]+1)fail[np]=q;        else{                       nq=++tot;               len[nq]=len[p]+1;            son[nq]=son[q];            fail[nq]=fail[q];            fail[q]=fail[np]=nq;            while(p&&son[p][x]==q){                son[p][x]=nq;p=fail[p];            }           }    }    last=np;    ans+=(LL)len[np]-len[fail[np]];} int main(){    scanf("%d",&n);    rt=last=tot=1;    for(int x,i=1;i<=n;i++){        scanf("%d",&x);        insert(x);        printf("%lld\n",ans);    }    return 0;}


0 0