Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include<bits/stdc++.h>
- using namespace std;
- #define gc c=getchar()
- #define r(x) read(x)
- #define ll long long
- template<typename T>
- inline void read(T&x){
- x=0;T k=1;char gc;
- while(!isdigit(c)){if(c=='-')k=-1;gc;}
- while(isdigit(c)){x=x*10+c-'0';gc;}x*=k;
- }
- const int N=2e5+7;
- int Max[N];
- int Min[N];
- map<int,int>to[N];
- int fa[N];
- int siz[N];
- int tot;
- inline int NewNode(int mx,int mi,int su){
- ++tot;
- Max[tot]=mx;
- Min[tot]=mi;
- fa[tot]=su;
- return tot;
- }
- inline int extend(int u,int c){
- int t=NewNode(Max[u]+1,0,0);
- siz[t]=1;
- for(;u&&!to[u][c];u=fa[u])to[u][c]=t;
- if(!u){
- Min[t]=1;
- fa[t]=1;
- return t;
- }
- int v=to[u][c];
- if(Max[v]==Max[u]+1){
- Min[t]=Max[v]+1;
- fa[t]=v;
- return t;
- }
- int x=NewNode(Max[u]+1,0,fa[v]);
- to[x]=to[v];
- Min[t]=Min[v]=Max[x]+1;
- fa[t]=fa[v]=x;
- Min[x]=Min[fa[x]]+1;
- for(;u&&to[u][c]==v;u=fa[u])to[u][c]=x;
- return t;
- }
- char s[N];
- int main(){
- int n;r(n);
- int lst=NewNode(0,0,0);
- ll ans=0;
- for(int i=0;i<n;++i){
- int t;r(t);
- lst=extend(lst,t);
- printf("%lld\n",ans+=Max[lst]-Max[fa[lst]]);
- }
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement