广义sam求助
查看原帖
广义sam求助
728778
hdkk楼主2024/8/6 08:48

写法是dfs加在线add,但是阳历没过

#include<bits/stdc++.h>
using namespace std;
const int N=2e5+5;
int ch[N*20][10],len[N*20],fa[N*20],tot=1,a[N],head[N],deg[N],num;
struct edge{
	int to,next;
}g[N*2];
void addd(int u,int v)
{
	num++;
	g[num].to=v;
	g[num].next=head[u];
	head[u]=num;
}
int add(int las,int c)
{
	if(ch[las][c])
	{
		int q=ch[las][c],p=las;
		if(len[q]==len[p]+1)
			return q;
		else
		{
			int nq=++tot;
			for(int i=0;i<26;i++)
				ch[nq][i]=ch[q][i];
			fa[nq]=fa[q];
			len[nq]=len[p]+1;
			for(;p&&ch[p][c]==q;p=fa[p]) ch[p][c]=nq;
			fa[q]=nq;
			return nq;
		}
	}
	int np=++tot,p=las;
	len[np]=len[p]+1;
	for(;p&&ch[p][c]==0;p=fa[p]) ch[p][c]=np;
	if(p==0)
	{
		fa[np]=1;
		return np;
	}
	int q=ch[p][c];
	if(len[q]==len[p]+1)
	{
		fa[np]=q;
		return np;
	}
	int nq=++tot;
	for(int i=0;i<26;i++)
		ch[nq][i]=ch[q][i];
	len[nq]=len[p]+1;
	fa[nq]=fa[q];
	fa[q]=fa[np]=nq;
	for(;p&&ch[p][c]==q;p=fa[p]) ch[p][c]=nq;
	return np;
}
void dfs(int u,int fa,int las)
{
	//cout<<u<<' ';
	int lst=add(las,a[u]);
	for(int i=head[u];i;i=g[i].next)
	{
		int v=g[i].to;
		if(v==fa) continue;
		dfs(v,u,lst);
	}
}
int main()
{
	int n,c;
	cin>>n>>c;
	for(int i=1;i<=n;i++) cin>>a[i];
	int u,v;
	for(int i=1;i<n;i++)
	{
		cin>>u>>v;
		addd(u,v);
		addd(v,u);
		deg[u]++,deg[v]++;
	}
	for(int i=1;i<=n;i++)
	{
		if(deg[i]==1)
			dfs(i,-1,1);
	}	
//	cout<<tot<<endl; 
	long long ans=0;
	for(int i=1;i<=tot;i++)
		ans+=len[i]-len[fa[i]];
	cout<<ans;
}
2024/8/6 08:48
加载中...