样例都过不了的代码:
#include<bits/stdc++.h>
using namespace std;
const int N=1e6+5;
int n=1,lst=1,len;
int head[N],ei;
long long sz[N],ans;
string str;
struct node{
int u,fa,s[26],len;
}nd[N];
struct edge{
int v,w,nxt;
}egs[N];
inline void add(int u,int v,int w)
{
egs[++ei].v=v;
egs[ei].w=w;
egs[ei].nxt=head[u];
head[u]=ei;
}
inline void extend(short c)
{
int fa=lst,u=lst=++n;sz[n]=1;
nd[u].len=nd[fa].len+1;
for(; fa&&!nd[fa].s[c]; fa=nd[fa].fa)
nd[fa].s[c]=u;
if(!fa)nd[u].fa=1;
else{
int q=nd[fa].s[c];
if(nd[q].len==nd[fa].len+1)nd[u].fa=q;
else
{
int nq=++n;
nd[nq]=nd[q],nd[nq].len=nd[fa].len+1;
nd[q].fa=nd[u].fa=nq;
for(; fa&&nd[fa].s[c]==q; fa=nd[fa].fa)
nd[fa].s[c]=nq;
}
}
}
inline void dfs(int u)
{
for(int i=head[u]; i; i=egs[i].nxt)
{
int v=egs[i].v;dfs(v);
sz[u]+=sz[v],ans+=(len-sz[v])*sz[v]*egs[i].w;
}
}
signed main()
{
ios::sync_with_stdio(0);
cin.tie(0),cout.tie(0);
cin>>str;int len=str.length();
for(int i=0; i<len; ++i)
extend(str[i]-'a');
for(int i=2; i<=n; ++i)
add(nd[i].fa,i,nd[i].len-nd[nd[i].fa].len);
dfs(1);cout<<ans<<'\n';
return 0;
}
以上代码,dfs时len变成0了是怎么回事?