BZOJ4516
SAM模板题,也不知道为什么数组会RE
Code:
#include<bits/stdc++.h>
#define ll long long
using namespace std;
inline int read(){
int res=0,f=1;char ch=getchar();
while(!isdigit(ch)) {if(ch=='-') f=-f;ch=getchar();}
while(isdigit(ch)) {res=(res<<3)+(res<<1)+(ch^48);ch=getchar();}
return res*f;
}
const int N=2000005;
int n,add;
ll ans=0;
map<int,int>ch[N];
int fa[N],l[N],last,tot;
inline int calc(int x){return l[x]-l[fa[x]];}
void ins(int c){
int flag=0;
int p=last,np=++tot;last=np;l[np]=l[p]+1;
for(;p&&!ch[p][c];p=fa[p]) ch[p][c]=np;
if(!p) fa[np]=1,ans+=calc(np);
else{
int q=ch[p][c];
if(l[q]==l[p]+1) fa[np]=q,ans+=calc(np);
else{
int nq=++tot;l[nq]=l[p]+1;
ch[nq]=ch[q];
fa[nq]=fa[q];ans+=calc(nq)-calc(q);
fa[q]=fa[np]=nq;ans+=calc(np)+calc(q);
for(;ch[p][c]==q;p=fa[p]) ch[p][c]=nq;
}
}
}
void work(){
tot=last=1;n=read();
for(int i=1;i<=n;i++) {add=read();ins(add);cout<<ans<<'\n';}
}
int main(){
work();
return 0;
}