字符集太大,用map记录trs指针维护后缀自动机。
#include <bits/stdc++.h>
using namespace std;
#define ll long long
#define N 210000
int n;
ll ans;
struct SAM
{
map<int,int>trs[N];
int cnt,len[N],fa[N],last;
void init(){cnt=last=1;}
void insert(int x)
{
int p=last,np=++cnt,q,nq;
len[np]=len[p]+1;last=np;
for(;p&&!trs[p].count(x);p=fa[p])trs[p][x]=np;
if(!p)fa[np]=1;
else
{
q=trs[p][x];
if(len[q]==len[p]+1)fa[np]=q;
else
{
fa[nq=++cnt]=fa[q];
len[nq]=len[p]+1;
ans+=len[nq]-len[fa[nq]];
ans-=len[q]-len[fa[q]];
trs[nq]=trs[q];
fa[q]=fa[np]=nq;
ans+=len[q]-len[fa[q]];
for(;p&&trs[p].count(x)&&trs[p][x]==q;p=fa[p])trs[p][x]=nq;
}
}
ans+=len[np]-len[fa[np]];
}
}sam;
int main()
{
//freopen("tt.in","r",stdin);
scanf("%d",&n);
sam.init();
for(int x;n--;)
{
scanf("%d",&x);
sam.insert(x);
printf("%lld\n",ans);
}
return 0;
}