题意

学习了广义后缀自动机。

广义后缀自动机与普通后缀自动机的区别在于它是对多个串建的,于是可以处理多个串。

广义后缀自动机和普通后缀自动机的区别在于两个特判,可以见这篇题解

对于这题,因为叶子数量小于20,以每个叶子为根跑dfs,将跑到的字符串插入SAM即可,求不同子串个数是SAM的常规操作,见我的笔记

code:

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn=2000010;
const int maxc=15;
int n,C,cnt;
int head[maxn],a[maxn],in[maxn];
struct edge{int to,nxt;}e[maxn<<1];
struct SAM
{
int tot,last;
int fa[maxn<<1],len[maxn<<1];
int ch[maxn<<1][maxc];
SAM(){last=tot=1;}
inline void add(int c)
{
if(ch[last][c]&&len[ch[last][c]]==len[last]+1){last=ch[last][c];return;}
int now=++tot;len[now]=len[last]+1;
int p=last;
while(p&&!ch[p][c])ch[p][c]=now,p=fa[p];
if(!p){fa[now]=1;last=now;return;}
int q=ch[p][c];
bool flag=0;
if(len[q]==len[p]+1)fa[now]=q;
else
{
if(p==last)flag=1;
int nowq=++tot;len[nowq]=len[p]+1;
for(int i=0;i<C;i++)ch[nowq][i]=ch[q][i];
fa[nowq]=fa[q],fa[q]=fa[now]=nowq;
while(p&&ch[p][c]==q)ch[p][c]=nowq,p=fa[p];
if(flag)last=nowq;
}
if(!flag)last=now;
}
inline ll query()
{
ll res=0;
for(int i=2;i<=tot;i++)res+=len[i]-len[fa[i]];
return res;
}
}sam;
inline void add(int u,int v)
{
e[++cnt].nxt=head[u];
head[u]=cnt;
e[cnt].to=v;
in[v]++;
}
void dfs(int x,int fa)
{
sam.add(a[x]);int last=sam.last;
for(int i=head[x];i;i=e[i].nxt)
{
int y=e[i].to;
if(y==fa)continue;
sam.last=last;dfs(y,x);
}
}
int main()
{
scanf("%d%d",&n,&C);
for(int i=1;i<=n;i++)scanf("%d",&a[i]);
for(int i=1;i<n;i++)
{
int u,v;scanf("%d%d",&u,&v);
add(u,v),add(v,u);
}
for(int i=1;i<=n;i++)if(in[i]==1)sam.last=1,dfs(i,0);
//cerr<<sam.tot<<endl;
printf("%lld",sam.query());
return 0;
}

最新文章

  1. Euler-Maruyama discretization(&quot;欧拉-丸山&quot;数值解法)
  2. C# ORM中Dto Linq Expression 和 数据库Model Linq Expression之间的转换
  3. 《SSM框架搭建》二.mybatis3,spring4整合
  4. 关于Xcode7更新之后使用 SDWebImage 图片加载不出来
  5. iOS菜单滚动联动内容区域功能实现
  6. July 13th, Week 29th Wednesday, 2016
  7. Linux----快速注释包含特定字符串的行
  8. 第一回写的用arraylist模拟栈操作
  9. 本地代码上传 -&gt; Github
  10. tomcat配置访问日志,访问首页主目录
  11. 通过配置Tomcat,让Android真机通过局域网访问PC的文件
  12. 组态ORACLE 11G ADG
  13. JDBC 初识
  14. Android开发者的Anko使用指南(三)之资源
  15. javaweb开发1.环境配置(javaweb插件下载及tomact在eclips中配置)
  16. linux就该这么学,第五课,
  17. CSS 图片居中
  18. java基础知识-逻辑运算符
  19. Awk 从入门到放弃(1)–学习笔记
  20. MVC实现文件下载

热门文章

  1. 我的朋友&amp;值得学习的大佬
  2. 微信小程序支付功能讲解(1)
  3. JavaScriptES6中Map与对象、数组,JSON之间的相互转换
  4. 终端中的 zsh 和 bash-魔法切换
  5. 黑科技,利用python拨打电话,控制手机技术!
  6. 图像处理-裁剪具有透明背景的png
  7. CSS-页面超出手机屏幕
  8. 教妹学 Java:难以驾驭的多线程
  9. redis pipeline批量处理提高性能
  10. 【数字图像分析】基于Python实现 Canny Edge Detection(Canny 边缘检测算法)