题目大意:给你一棵$n$个点的树,最多有$20$个叶子节点,问共有几个不同的子串

题解:广义$SAM$,对每个叶子节点深搜一次,每个节点的$lst$设为这个节点当时的父亲,这样就可以时建出来的$SAM$含有所有的字串

卡点:

C++ Code:

#include <cstdio>
#include <iostream> #define maxn 100010
int head[maxn], cnt;
struct Edge {
int to, nxt;
} e[maxn << 1];
int ind[maxn];
inline void addedge(int a, int b) {
e[++cnt] = (Edge) {b, head[a]}; head[a] = cnt;
e[++cnt] = (Edge) {a, head[b]}; head[b] = cnt;
} int w[maxn]; namespace SAM {
#define N (maxn * 22 << 1)
int lst = 1, idx = 1;
int R[N], fail[N], nxt[N][10];
void append(int ch) {
int p = lst, np = lst = ++idx; R[np] = R[p] + 1;
for (; p && !nxt[p][ch]; p = fail[p]) nxt[p][ch] = np;
if (!p) fail[np] = 1;
else {
int q = nxt[p][ch];
if (R[p] + 1 == R[q]) fail[np] = q;
else {
int nq = ++idx;
R[nq] = R[p] + 1, fail[nq] = fail[q], fail[q] = fail[np] = nq;
std::copy(nxt[q], nxt[q] + 10, nxt[nq]);
for (; nxt[p][ch] == q; p = fail[p]) nxt[p][ch] = nq;
}
}
}
void dfs(int u, int fa = 0) {
append(w[u]);
int tmp = lst;
for (int i = head[u]; i; i = e[i].nxt) {
int v = e[i].to;
if (v != fa) dfs(v, u), lst = tmp;
}
}
long long query() {
long long ans = 0;
for (int i = 2; i <= idx; i++) ans += R[i] - R[fail[i]];
return ans;
}
#undef N
} int n, m;
int main() {
scanf("%d%d", &n, &m);
for (int i = 1; i <= n; i++) scanf("%d", w + i);
for (int i = 1, a, b; i < n; i++) {
scanf("%d%d", &a, &b);
addedge(a, b); ind[a]++, ind[b]++;
}
for (int i = 1; i <= n; i++) if (ind[i] == 1) {
SAM::lst = 1;
SAM::dfs(i);
}
printf("%lld\n", SAM::query());
return 0;
}

  

最新文章

  1. Entity Framework 6 Recipes 2nd Edition(12-1)译 -&gt; 当SaveChanges( ) 被调用时执行你的代码
  2. iOS 之项目中遇到的问题总结
  3. 【Objective-C】NSDate详解及获取当前时间等常用操作
  4. FireMonkey 保存图片到JPG的方法 BMP转JPG
  5. nginx 出现413 Request Entity Too Large问题的解决方法
  6. Git撤销操作命令
  7. FTP上传类
  8. ListView配合BaseAdapter
  9. sass中 混合宏 VS 继承 VS 占位符 各自的使用时机和特点
  10. Java基础之垃圾回收
  11. git使用系列(一)
  12. 学习MVC之租房网站(六)-用户登录和权限控制
  13. ASP.NET 设计模式:应用程序分层与关注点分离(SoC)
  14. 【easy】202. Happy Number
  15. contos最小包安装完后一些准备
  16. 兼容在安装linux系统过程中不支持非原装的光模块的命令
  17. 爬虫-----爬取所有国家的首都、面积 ,并保存到txt文件中
  18. MySQL 全局锁、表锁以及行锁
  19. 考勤管理系统V1.0.3
  20. 当activity改变时,我们如何处理它

热门文章

  1. PHP数组中插入元素
  2. CakePHP2.x 发送邮件
  3. Question | 你所遇到的验证码问题可能都在这里了
  4. SQL注入篇二------利用burp盲注,post注入,http头注入,利用burpsuit找注入点,宽字节注入
  5. JMeter随机上传附件
  6. 逆波兰表达式[栈 C 语言 实现]
  7. Request对象及常用方法
  8. 【system.number】使用说明
  9. JSON.parse() 与 eval()
  10. 【Python 开发】第二篇 :Python安装