题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=3926


广义后缀自动机...

久仰公之大名啊...

太阳花田的结构比较特殊,只与一个空地相邻的空地数量不超过$20$个。

这就是说叶子节点的个数不超过$20$个,我们知道树上的每一条路径一定对应了一个:以某一个叶子节点为根的tire树的后缀的前缀(也就是子串),我们知道SAM是可以统计不同子串的个数的即:${\sum _{i=1}^{n} (len[i]-len[fa[i]])}$

考虑如何把这20棵tire构成一个后缀自动机,我们在只有一个串的时候$np$就是直接指向前一个字符的位置,因为我们现在是树结构,所以$np$指向的应该是该点在$trie$树中父节点的位置,其他的就和普通的$SAM$一样,为了找到节点的父亲,$DFS$找即可。


 #include<iostream>
#include<cstdio>
#include<algorithm>
#include<vector>
#include<cstdlib>
#include<cmath>
#include<cstring>
using namespace std;
#define maxn 1000010
#define llg long long
#define SIZE 11
#define yyj(a) freopen(a".in","r",stdin),freopen(a".out","w",stdout);
llg n,m,last=,root=,du[maxn],v[maxn]; vector<llg>a[maxn]; struct SAM
{
struct
{
llg len,f,ch[SIZE];
void init(){len=,f=,memset(ch,,sizeof(ch));}
}e[maxn*]; llg insert(llg p,llg c)
{
llg np=++last; e[np].init();
e[np].len=e[p].len+;
for (;p && !e[p].ch[c];p=e[p].f) e[p].ch[c]=np;
if (!p) e[np].f=root;
else
{
llg q=e[p].ch[c];
if (e[q].len==e[p].len+) e[np].f=q;
else
{
llg nq=++last;
e[nq].init();
e[nq]=e[q];
e[nq].len=e[p].len+;
e[q].f=e[np].f=nq;
for (;p && e[p].ch[c]==q;p=e[p].f) e[p].ch[c]=nq;
}
}
return np;
}
}sam; void init()
{
llg x,y;
cin>>n>>m;
for (llg i=;i<=n;i++) scanf("%lld",&v[i]);
for (llg i=;i<n;i++)
{
scanf("%lld%lld",&x,&y);
a[x].push_back(y),a[y].push_back(x);
du[x]++,du[y]++;
}
} void dfs(llg x,llg fa,llg p)
{
llg t=sam.insert(p,v[x]),w=a[x].size();
for (llg i=;i<w;i++)
if (a[x][i]!=fa)
dfs(a[x][i],x,t);
} int main()
{
yyj("god");
init();
for (llg i=;i<=n;i++) if (du[i]==) dfs(i,,);
llg ans=;
for (llg i=;i<=last;i++) ans+=sam.e[i].len-sam.e[sam.e[i].f].len;
cout<<ans;
return ;
}

【BZOJ】3926: [Zjoi2015]诸神眷顾的幻想乡的更多相关文章

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

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

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

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

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

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

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

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

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

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

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

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

  7. 【刷题】BZOJ 3926 [Zjoi2015]诸神眷顾的幻想乡

    Description 幽香是全幻想乡里最受人欢迎的萌妹子,这天,是幽香的2600岁生日,无数幽香的粉丝到了幽香家门前的太阳花田上来为幽香庆祝生日. 粉丝们非常热情,自发组织表演了一系列节目给幽香看. ...

  8. BZOJ.3926.[ZJOI2015]诸神眷顾的幻想乡(广义后缀自动机)

    题目链接 要对多个串同时建立SAM,有两种方法: 1.将所有串拼起来,中间用分隔符隔开,插入字符正常插入即可. 2.在这些串的Trie上建SAM.实际上并不需要建Trie,还是只需要正常插入(因为本来 ...

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

    神奇的性质,叶子节点不超过20个. 然后把这些节点提出来构成一颗新树,那么这些树恰好包含了所有的情况. 所以直接广义后缀自动机. 然后统计本质不同的字符串就很简单显然了. #include <c ...

  10. bzoj 3926: [Zjoi2015]诸神眷顾的幻想乡【SAM】

    有一个显然的性质就是每个串一定在某个叶子为根的树中是一条直的链 然后因为SAM里是不会有相同状态的,所以以每个叶子为根dfs一遍,并且动态构造SAM(这里的节点u的last指向父亲),最后统计答案就是 ...

随机推荐

  1. [转载]Oracle数据库 sql%found,sql%notfound,sql%rowcount

    sql%found,sql%notfound,sql%rowcount 在执行DML(insert,update,delete)语句时,可以用到以下三个隐式游标(游标是维护查询结果的内存中的一个区域, ...

  2. Selenium 常用定位对象元素的方法

    常见定位对象元素的方法 在使用selenium webdriver进行元素定位时,通常使用findElement或findElements方法结合By类返回的元素句柄来定位元素.其中By类的常用定位方 ...

  3. 解决Win 10上SSD缓慢问题

    标准硬盘驱动器(HDD)由于其高存储容量和低成本而长期以来一直是计算机的主要存储设备.固态硬盘(SSD)是另一种存储解决方案,正在逐步取代大多数硬盘驱动器.但是,随着时间的推移,SSD会因各种原因而大 ...

  4. python-数据分析与展示(Numpy、matplotlib、pandas)---3

    笔记内容整理自mooc上北京理工大学嵩天老师python系列课程数据分析与展示,本人小白一枚,如有不对,多加指正 0.pandas基于Numpy实现的,前者注重应用,后者注重结构 1.Series类型 ...

  5. MyEclipse配置Struts2的本地工作空间中的DTD约束文件

    1.拷贝URI http://struts.apache.org/dtds/struts-2.3.dtd 2.配置XML Catalog 3.struts-2.3.dtd文件来源 解压jar包\Web ...

  6. PyTorch 常用方法总结1:生成随机数Tensor的方法汇总(标准分布、正态分布……)

    在使用PyTorch做实验时经常会用到生成随机数Tensor的方法,比如: torch.rand() torch.randn() torch.normal() torch.linespace() 在很 ...

  7. 新增async

    import asyncio from threading import Thread import time now = lambda: time.time() print('start',now( ...

  8. Linux的常用路由配置

    1.配置默认路由 ip route add default via 192.168.10.1 dev eth0 route add default gw 192.168.10.1 2.间接路由: ip ...

  9. Tsung压力测试工具安装使用

    工具安装 1)unixODBC ./configure; make; make install 或者yum安装 2)ncurses-devel ./configure; make; make inst ...

  10. fjwc2019

    机房搬迁.......再加上文化课.......咕了十几天才有空补上....... day0听一个教授讲理论......在学长的带领下咕掉了..... D1 T1:#178. 「2019冬令营提高组」 ...