BZOJ 3926: [Zjoi20150]诸神眷顾的幻想乡(后缀自动机)
被这道题坑了= =
只与一个空地相连的空地不超过20个
只与一个空地相连的空地不超过20个
因为很重要所以说两遍
就是说儿子节点最多只有20个
把这20个节点作为根遍历一遍所得到的tire所得到的所有不同子串就是答案了
怎么求?
这可是CLJ出的啊
想想她讲过什么
后缀自动机或可持久化后缀数组的经典应用
由于不会打可持久化后缀数组,就打了个自动机
自己对后缀自动机根本不熟,找时间在多做几道题
CODE:
#include<cstdio>
#include<iostream>
#include<cstring>
#include<algorithm>
#include<vector>
using namespace std;
struct node{
node* c[];int id;
node(){memset(c,,sizeof(c));}
};
#define maxn 101000
vector<int> e[maxn];
#define pb push_back
int a[maxn],pre[maxn];
inline void bfs(int x,node *&y){
if (!y) y=new node;
static int q[maxn];
static node * p[maxn];
q[]=x;
p[]=y;
pre[x]=;
for (int l=,r=,u=q[];l<=r;u=q[++l]) {
for (vector<int>::iterator i=e[u].begin();i!=e[u].end();++i) {
if (*i==pre[u]) continue;
pre[*i]=u;q[++r]=*i;
if (!p[l]->c[a[*i]]) p[l]->c[a[*i]]=new node;
p[r]=p[l]->c[a[*i]];
}
}
}
struct snode{int ch[],l,fa;}s[maxn*];
typedef long long ll;
int cnt;ll ans;
inline void add(int x,node* u) {
int p=++cnt,t=u->id;
u->c[x]->id=p;
s[p].l=s[t].l+;
for (;t!=-&&!s[t].ch[x];t=s[t].fa) s[t].ch[x]=p;
if (t==-) s[p].fa=;
else if (s[t].l+==s[s[t].ch[x]].l) s[p].fa=s[t].ch[x];
else {
int r=++cnt,q=s[t].ch[x];
s[r]=s[q];s[r].l=s[t].l+;
s[p].fa=s[q].fa=r;
for (;t!=-&&s[t].ch[x]==q;t=s[t].fa) s[t].ch[x]=r;
}
ans+=s[p].l-s[s[p].fa].l;
}
int c;
node *root;
inline void build(){
static node *q[maxn*];
q[]=root;
root->id=;
s[].fa=-;
for (int l=,r=;l<=r;l++) {
node *u=q[l];
for (int i=;i<=c;i++)
if (u->c[i]) {
add(i,u);
q[++r]=u->c[i];
}
}
}
int main(){
int n;
scanf("%d%d",&n,&c);
for (int i=;i<=n;i++) scanf("%d",a+i);
for (int i=;i<=n;i++) a[i]++;
root=new node;
for (int i=;i<n;i++) {
int x,y;
scanf("%d%d",&x,&y);
e[x].pb(y);e[y].pb(x);
}
for (int i=;i<=n;i++) if (e[i].size()==) bfs(i,root->c[a[i]]);
build();
printf("%lld\n",ans);
return ;
}
X$MX.png)
BZOJ 3926: [Zjoi20150]诸神眷顾的幻想乡(后缀自动机)的更多相关文章
- BZOJ 3926: [Zjoi2015]诸神眷顾的幻想乡(后缀自动机)
传送门 解题思路 因为叶节点不超过\(20\)个,所以可以枚举这些叶节点,并把这些节点当做根扫整棵树.可以证明所有的子串一定可以被便利到,然后可以对这些串建广义后缀自动机.\(dfs\)的时候要记录一 ...
- BZOJ 3926: [Zjoi20150]诸神眷顾的幻想乡
3926: [Zjoi20150]诸神眷顾的幻想乡 Time Limit: 10 Sec Memory Limit: 512 MBSubmit: 438 Solved: 273 Descripti ...
- BZOJ 3926: [Zjoi2015]诸神眷顾的幻想乡
3926: [Zjoi2015]诸神眷顾的幻想乡 Time Limit: 10 Sec Memory Limit: 512 MBSubmit: 1017 Solved: 599[Submit][S ...
- 字符串(广义后缀自动机):BZOJ 3926 [Zjoi2015]诸神眷顾的幻想乡
3926: [Zjoi2015]诸神眷顾的幻想乡 Time Limit: 10 Sec Memory Limit: 512 MBSubmit: 843 Solved: 510[Submit][St ...
- BZOJ 3926: [Zjoi2015]诸神眷顾的幻想乡 [广义后缀自动机 Trie]
3926: [Zjoi2015]诸神眷顾的幻想乡 Time Limit: 10 Sec Memory Limit: 512 MBSubmit: 1124 Solved: 660[Submit][S ...
- bzoj 3926 [Zjoi2015]诸神眷顾的幻想乡(SAM)
[题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=3926 [题意] 给定一棵树,每个节点都有相应的颜色,且保证叶子数不超过20,问 ...
- ●BZOJ 3926 [Zjoi2015]诸神眷顾的幻想乡
题链: http://www.lydsy.com/JudgeOnline/problem.php?id=3926题解&&代码: 后缀自动机,Trie树 如果以每个叶子为根,所有的子串一 ...
- BZOJ 3926: [Zjoi2015]诸神眷顾的幻想乡 广义后缀自动机 后缀自动机 字符串
https://www.lydsy.com/JudgeOnline/problem.php?id=3926 广义后缀自动机是一种可以处理好多字符串的一种数据结构(不像后缀自动机只有处理一到两种的时候比 ...
- 【刷题】BZOJ 3926 [Zjoi2015]诸神眷顾的幻想乡
Description 幽香是全幻想乡里最受人欢迎的萌妹子,这天,是幽香的2600岁生日,无数幽香的粉丝到了幽香家门前的太阳花田上来为幽香庆祝生日. 粉丝们非常热情,自发组织表演了一系列节目给幽香看. ...
随机推荐
- IOS开发-OC学习-protocol(协议)
在OC语言中,协议是一组方法,里面有两种方法,一种是遵守这个协议的类的实例必须实现的方法,另一种是可以实现也可以不实现的方法. 例如我定义一个学生的协议,这个协议里有两个方法,其中一个是必选的方法:学 ...
- xcode调试
reference:http://www.cnblogs.com/ylkk_925/p/3238171.html 1.添加异常断点,快速定位抛出异常的代码位置,帮助快速解决Bug.(PS:可以在LLD ...
- JavaScript高级程序设计-8:BOM
1. 什么是BOM? BOM(Browser Object Mode) 是指浏览器对象模型,是用于描述这种对象与对象之间层次关系的模型,浏览器对象模型提供了独立于内容的.可以与浏览器窗口进行互动的对象 ...
- ASP.NET常用的控件怎么添加
http://jingyan.baidu.com/article/d8072ac4224747ec95cefda2.html
- Python计算一个项目中含有的代码行数
最近想要知道以前做过的project有多少行代码,因为文件太多,直接手工数效率太低,于是编写一个python程序用来计算一个project有多少代码行. 首先,在一个项目中,有很多子文件夹,子文件夹中 ...
- Selenium2(java)定位页面元素 二
辅助工具: chrome浏览器,F12打开控制台; Firefox浏览器,F12打开控制台; 或者选中要定位的元素右键 安装firefox扩展firebug和firepath; 安装之后F12可调用f ...
- XML 字符串解析
微信红包发送完成后返回xml字符串,解析过程如下: 1.调用解析: public ActionResult GetEntityFromXml() { string str = @"<x ...
- Struts2的拦截器----Dog实例
拦截器是一个类,这个类包含方法,用来解决DRY规则,即代码复用的问题.如果不调用拦截器,代码中需要显示通过代码调用目标方法,定义了拦截器,系统就会自动执行.大部分时候,拦截器方法都是通过代理的方式调用 ...
- XHTML 是以 XML 格式编写的 HTML
什么是 XHTML? XHTML 指的是可扩展超文本标记语言 XHTML 与 HTML 4.01 几乎是相同的 XHTML 是更严格更纯净的 HTML 版本 XHTML 是以 XML 应用的方式定义的 ...
- 判断div是否有滚动条
判断div是否有滚动条 var obj=document.getElementById("showDiv"); if(obj.scrollHeight>obj.clientH ...