可以拿来练一下版
#include<cstdio>
#include<cstring>
#include<iostream>
#include<map>
#define maxn 250020*2
#define LL long long
using 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;
}