后缀自动机扩展到树形结构上。

先建出大的Trie,然后我们得到了一棵Trie树,对于树上的每个节点,保存一个后缀自动机从根走它代表的字符串后到达的节点,每次其儿子就从父亲的这个节点开始扩展。

 /**************************************************************
Problem: 3926
User: idy002
Language: C++
Result: Accepted
Time:4320 ms
Memory:460976 kb
****************************************************************/ #include <cstdio>
#include <cassert>
#include <cstring>
#include <algorithm>
#define N 100010
#define ST 3000100
#define SS ST<<1
using namespace std; typedef long long dnt; int qu[SS], stk[SS], bg, ed, top; struct Sam {
int son[SS][], val[SS], pnt[SS], ntot;
Sam() { pnt[] = -; };
int append( int p, int c ) {
int np = ++ntot;
val[np] = val[p]+;
while( p!=- && !son[p][c] )
son[p][c]=np, p=pnt[p];
if( p==- ) {
pnt[np] = ;
} else {
int q=son[p][c];
if( val[q]==val[p]+ ) {
pnt[np] = q;
} else {
int nq = ++ntot;
memcpy( son[nq], son[q], sizeof(son[nq]) );
val[nq] = val[p]+;
pnt[nq] = pnt[q];
pnt[q] = pnt[np] = nq;
while( p!=- && son[p][c]==q )
son[p][c]=nq, p=pnt[p];
}
}
return np;
}
dnt count() {
dnt rt = ;
for( int u=; u<=ntot; u++ )
rt += val[u]-val[pnt[u]];
return rt;
}
}sam;
struct Trie {
int son[ST][], last[ST], ntot;
void insert( int *T ) {
int u=;
for( int i=; T[i]!=-; i++ ) {
int c=T[i];
if( !(<=T[i]&&T[i]<) ) {
assert( T[i]>= && T[i]<= );
}
if( !son[u][c] ) son[u][c]=++ntot;
u=son[u][c];
}
}
void build() {
last[] = ;
qu[bg=ed=] = ;
while( bg<=ed ) {
int u=qu[bg++];
for( int c=; c<; c++ ) {
int v=son[u][c];
if( !v ) continue;
last[v] = sam.append( last[u], c );
qu[++ed] = v;
}
}
}
}trie; int n, c;
int head[N], wght[N], dest[N<<], next[N<<], etot;
int dgr[N], fat[N]; void adde( int u, int v ) {
etot++;
dest[etot] = v;
next[etot] = head[u];
head[u] = etot;
}
void bfs( int s ) {
qu[bg=ed=] = s;
fat[s] = ;
while( bg<=ed ) {
int u=qu[bg++];
for( int t=head[u]; t; t=next[t] ) {
int v=dest[t];
if( v==fat[u] ) continue;
qu[++ed] = v;
fat[v] = u;
}
}
for( int t=; t<=top; t++ ) {
int u=stk[t];
bg=, ed=;
while( u ) {
qu[++ed] = wght[u];
u=fat[u];
}
reverse( qu+, qu++ed );
qu[++ed] = -;
trie.insert( qu+ );
}
}
int main() {
scanf( "%d%d", &n, &c );
for( int i=; i<=n; i++ )
scanf( "%d", wght+i );
for( int i=,u,v; i<n; i++ ) {
scanf( "%d%d", &u, &v );
adde( u, v );
adde( v, u );
dgr[u]++, dgr[v]++;
}
for( int u=; u<=n; u++ )
if( dgr[u]<= ) stk[++top] = u;
for( int t=; t<=top; t++ )
bfs(stk[t]);
trie.build();
printf( "%lld\n", sam.count() );
return ;
}

bzoj 3926的更多相关文章

  1. 【BZOJ 3926】 [Zjoi2015]诸神眷顾的幻想乡 (广义SAM)

    3926: [Zjoi2015]诸神眷顾的幻想乡 Time Limit: 10 Sec  Memory Limit: 512 MBSubmit: 974  Solved: 573 Descriptio ...

  2. BZOJ 3926 诸神眷顾的幻想乡

    BZOJ 3926 诸神眷顾的幻想乡 开始看错题看成了每个点度数不超过20 后来翻了翻题解原来看错题的不止我一个 既然叶子数量不超过20,考虑树上的任何一条路径,以任何点为根时,如果它不是一条从上到下 ...

  3. BZOJ 3926: [Zjoi2015]诸神眷顾的幻想乡

    3926: [Zjoi2015]诸神眷顾的幻想乡 Time Limit: 10 Sec  Memory Limit: 512 MBSubmit: 1017  Solved: 599[Submit][S ...

  4. bzoj 3926 [Zjoi2015]诸神眷顾的幻想乡(SAM)

    [题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=3926   [题意]   给定一棵树,每个节点都有相应的颜色,且保证叶子数不超过20,问 ...

  5. 字符串(广义后缀自动机):BZOJ 3926 [Zjoi2015]诸神眷顾的幻想乡

    3926: [Zjoi2015]诸神眷顾的幻想乡 Time Limit: 10 Sec  Memory Limit: 512 MBSubmit: 843  Solved: 510[Submit][St ...

  6. BZOJ 3926 && ZJOI 2015 诸神眷顾的幻想乡 (广义后缀自动机)

    3926: [Zjoi2015]诸神眷顾的幻想乡 Time Limit: 10 Sec Memory Limit: 512 MB Description 幽香是全幻想乡里最受人欢迎的萌妹子,这天,是幽 ...

  7. 【BZOJ 3926】【ZJOI 2015】诸神眷顾的幻想乡

    http://www.lydsy.com/JudgeOnline/problem.php?id=3926 广义后缀自动机的例题,感觉广义后缀自动机好恶心... 广义后缀自动机是对一个trie建立的后缀 ...

  8. BZOJ 3926: [Zjoi2015]诸神眷顾的幻想乡 [广义后缀自动机 Trie]

    3926: [Zjoi2015]诸神眷顾的幻想乡 Time Limit: 10 Sec  Memory Limit: 512 MBSubmit: 1124  Solved: 660[Submit][S ...

  9. ●BZOJ 3926 [Zjoi2015]诸神眷顾的幻想乡

    题链: http://www.lydsy.com/JudgeOnline/problem.php?id=3926题解&&代码: 后缀自动机,Trie树 如果以每个叶子为根,所有的子串一 ...

  10. BZOJ 3926: [Zjoi2015]诸神眷顾的幻想乡 广义后缀自动机 后缀自动机 字符串

    https://www.lydsy.com/JudgeOnline/problem.php?id=3926 广义后缀自动机是一种可以处理好多字符串的一种数据结构(不像后缀自动机只有处理一到两种的时候比 ...

随机推荐

  1. Find Minimum in Rotated Sorted Array I & II

    Find Minimum in Rotated Sorted Array I Suppose a sorted array is rotated at some pivot unknown to yo ...

  2. [问题解决]同时显示多个Notification时PendingIntent的Intent被覆盖?

    情况是这样的,使用NotificationManager触发多个Notification: private Notification genreNotification(Context context ...

  3. hibernate学习之一 框架配置

    hibernate 框架 1.hibernate框架应用在javaee三层结构中的dao层框架 2.好处就是不需要写复杂jdbc代码,不需要sql语句实现 3.是开源的轻量级框架 hibernate使 ...

  4. scala可变长度参数(转)

    可变长度参数 Scala 允许你指明函数的最后一个参数可以是重复的.这可以允许客户向函数传入可变长度参数列表.想要标注一个重复参数,在参数的类型之后放一个星号.例如: scala> def ec ...

  5. HTML语义化(2016/3/16更新)

    目录 什么是HTML语义化? 为什么要语义化 常用标签的语义 HTML5新元素 一.什么是HTML语义化? 简单来讲就是:每个标签做自己的事,使得能够被机器直接读懂. 二.为什么要语义化? 1.更容易 ...

  6. java基础65 JavaScript中的Window对象(网页知识)

    1.javaScript组成部分 1.EMCAScript(基本语法)    2.BOM(Browser Object Model):浏览器对象模型            浏览器对象模型中的浏览器的各 ...

  7. java基础51 IO流技术(打印流)

    1.打印流(printStream)的概念 打印流可以打印任意的数据类型 2.printStream的步骤 1.找到目标文件    2.创建一个打印流    3.打印信息    4.关闭资源 3.实例 ...

  8. Java多线程-Java多线程概述

    第一章 Java多线程概述 线程的启动 线程的暂停 线程的优先级 线程安全相关问题 1.1 进程与线程 进程:可以将运行在内存中的程序(如exe文件)理解为进程,进程是受操作系统管理的基本的运行单元. ...

  9. Linux基础入门学习笔记之四

    环境变量与文件查找 环境变量 变量 所谓shell变量,就是计算机中用于记录一个值(不一定是数值,也可以是字符或字符串)的符号,而这些符号将用于不同的运算处理中.通常变量与值是一对一的关系,可以通过表 ...

  10. 如何用python解析mysqldump文件

    一.前言 最近在做离线数据导入HBase项目,涉及将存储在Mysql中的历史数据通过bulkload的方式导入HBase.由于源数据已经不在DB中,而是以文件形式存储在机器磁盘,此文件是mysqldu ...