被这道题坑了= =
只与一个空地相连的空地不超过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 ;
}

BZOJ 3926: [Zjoi20150]诸神眷顾的幻想乡(后缀自动机)的更多相关文章

  1. BZOJ 3926: [Zjoi2015]诸神眷顾的幻想乡(后缀自动机)

    传送门 解题思路 因为叶节点不超过\(20\)个,所以可以枚举这些叶节点,并把这些节点当做根扫整棵树.可以证明所有的子串一定可以被便利到,然后可以对这些串建广义后缀自动机.\(dfs\)的时候要记录一 ...

  2. BZOJ 3926: [Zjoi20150]诸神眷顾的幻想乡

    3926: [Zjoi20150]诸神眷顾的幻想乡 Time Limit: 10 Sec  Memory Limit: 512 MBSubmit: 438  Solved: 273 Descripti ...

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

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

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

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

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

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

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

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

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

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

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

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

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

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

随机推荐

  1. IOS开发-OC学习-protocol(协议)

    在OC语言中,协议是一组方法,里面有两种方法,一种是遵守这个协议的类的实例必须实现的方法,另一种是可以实现也可以不实现的方法. 例如我定义一个学生的协议,这个协议里有两个方法,其中一个是必选的方法:学 ...

  2. xcode调试

    reference:http://www.cnblogs.com/ylkk_925/p/3238171.html 1.添加异常断点,快速定位抛出异常的代码位置,帮助快速解决Bug.(PS:可以在LLD ...

  3. JavaScript高级程序设计-8:BOM

    1. 什么是BOM? BOM(Browser Object Mode) 是指浏览器对象模型,是用于描述这种对象与对象之间层次关系的模型,浏览器对象模型提供了独立于内容的.可以与浏览器窗口进行互动的对象 ...

  4. ASP.NET常用的控件怎么添加

    http://jingyan.baidu.com/article/d8072ac4224747ec95cefda2.html

  5. Python计算一个项目中含有的代码行数

    最近想要知道以前做过的project有多少行代码,因为文件太多,直接手工数效率太低,于是编写一个python程序用来计算一个project有多少代码行. 首先,在一个项目中,有很多子文件夹,子文件夹中 ...

  6. Selenium2(java)定位页面元素 二

    辅助工具: chrome浏览器,F12打开控制台; Firefox浏览器,F12打开控制台; 或者选中要定位的元素右键 安装firefox扩展firebug和firepath; 安装之后F12可调用f ...

  7. XML 字符串解析

    微信红包发送完成后返回xml字符串,解析过程如下: 1.调用解析: public ActionResult GetEntityFromXml() { string str = @"<x ...

  8. Struts2的拦截器----Dog实例

    拦截器是一个类,这个类包含方法,用来解决DRY规则,即代码复用的问题.如果不调用拦截器,代码中需要显示通过代码调用目标方法,定义了拦截器,系统就会自动执行.大部分时候,拦截器方法都是通过代理的方式调用 ...

  9. XHTML 是以 XML 格式编写的 HTML

    什么是 XHTML? XHTML 指的是可扩展超文本标记语言 XHTML 与 HTML 4.01 几乎是相同的 XHTML 是更严格更纯净的 HTML 版本 XHTML 是以 XML 应用的方式定义的 ...

  10. 判断div是否有滚动条

    判断div是否有滚动条 var obj=document.getElementById("showDiv"); if(obj.scrollHeight>obj.clientH ...