链接:

#include <stdio.h>
int main()
{puts("转载请注明出处[vmurder]谢谢");puts("网址:blog.csdn.net/vmurder/article/details/44891009");
}

题意、题解、数据、出题人标程

http://wjmzbmr.com/archives/zjoi-2015-day-1%e9%a2%98%e8%a7%a3/26

本蒟蒻的题解:

首先我们发现叶子节点很少,所以可以从每个叶子节点开始扫,然后就建立起了一棵大大的Trie树!然后统计有多少子串,就需要把Trie建立成广义(多串)后缀自动机。

然后怎么统计呢?
ans=∑i,i∈samdepi−deppaians=∑_{i,i\in sam} dep_i-dep_{pa_i}
为什么呢?
考虑abc建立起来的串,答案是6……嗯什么也发现不了。

然后abcb,我们发现第一个b字符和第二个b字符,它们的pa都是那个辅助节点。
发现是每个节点,从1开始到它的dep,都能构成长短不一的子串,但是其中或许会有重复,而对于这两个’b’,重复的部分都是pa的1~dep一部分,然后都减去了。
最终得到正确答案9。

代码:

#include <queue>
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#define N 101000
#define T 10
using namespace std;struct Eli
{int v,next;
}e[N<<1];
int head[N],cnt,d[N];
inline void add(int u,int v)
{d[v]++;e[++cnt].v=v;e[cnt].next=head[u];head[u]=cnt;
}
int n,m,src[N];
struct SAM
{int son[N*20][T],pa[N*20],dep[N*20]; // 那个吧。这里开少了一倍TAT,竟然AC了int root,cnt,crs[N*20]; // 其实也不算奇怪,均摊下来差不多啦~(不是太好构造~)void begin(){crs[0]=root=cnt=1;}int newnode(int last){dep[++cnt]=dep[last]+1;return cnt;}int add(int p,int x){int np=son[p][x];if(np&&dep[np]==dep[p]+1)return np;else np=newnode(p); /* 这是与单串后缀自动机唯一有区别的部分*/while(p&&!son[p][x])son[p][x]=np,p=pa[p];if(!p)pa[np]=root;else {int q=son[p][x];if(dep[q]==dep[p]+1)pa[np]=q;else {int nq=newnode(p);pa[nq]=pa[q],pa[q]=pa[np]=nq;memcpy(son[nq],son[q],sizeof son[q]);while(p&&son[p][x]==q)son[p][x]=nq,p=pa[p];}}return np;}void dfs(int x,int p){crs[x]=add(crs[p],src[x]);int i,v;for(i=head[x];i;i=e[i].next){v=e[i].v;if(v==p)continue;dfs(v,x);}}bool vis[N*20];queue<int>q;long long bfs(){long long ret=0;q.push(root);int i,u,v;while(!q.empty()){u=q.front(),q.pop();if(u!=root)ret+=dep[u]-dep[pa[u]];for(i=0;i<m;i++){v=son[u][i];if(vis[v])continue;vis[v]=true,q.push(v);}}return ret;}
}sam;
int main()
{freopen("test.in","r",stdin);int i,a,b;scanf("%d%d",&n,&m);for(i=1;i<=n;i++)scanf("%d",&src[i]);for(i=1;i<n;i++){scanf("%d%d",&a,&b);add(a,b),add(b,a);}sam.begin();for(i=1;i<=n;i++)if(d[i]==1){sam.dfs(i,0);break;}cout<<sam.bfs()<<endl;return 0;
}

【BZOJ3926】【Zjoi2015】诸神眷顾的幻想乡 广义后缀自动机相关推荐

  1. 【BZOJ3926】[Zjoi2015]诸神眷顾的幻想乡 广义后缀自动机

    [BZOJ3926][Zjoi2015]诸神眷顾的幻想乡 Description 幽香是全幻想乡里最受人欢迎的萌妹子,这天,是幽香的2600岁生日,无数幽香的粉丝到了幽香家门前的太阳花田上来为幽香庆祝 ...

  2. [bzoj3926][Zjoi2015]诸神眷顾的幻想乡

    来自FallDream的博客,未经允许, 请勿转载,谢谢. 幽香是全幻想乡里最受人欢迎的萌妹子,这天,是幽香的2600岁生日,无数幽香的粉丝到了幽香家门前的太阳花田上来为幽香庆祝生日. 粉丝们非常热情 ...

  3. Luogu P3346 [ZJOI2015]诸神眷顾的幻想乡 广义SAM 后缀自动机

    题目链接 \(Click\) \(Here\) 真的是好题啊-不过在说做法之前先强调几个自己总是掉的坑点. 更新节点永远记不住往上跳\(p = fa[p]\) 新建节点永远记不住\(len[y] = ...

  4. [Zjoi2015]诸神眷顾的幻想乡

    [Zjoi2015]诸神眷顾的幻想乡 Time Limit: 10 Sec  Memory Limit: 512 MB Submit: 1537  Solved: 892 Description 幽香 ...

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

    3926: [Zjoi2015]诸神眷顾的幻想乡 Time Limit: 10 Sec   Memory Limit: 512 MB Submit: 1381   Solved: 811 [ Subm ...

  6. bzoj 3926: [Zjoi2015]诸神眷顾的幻想乡(广义后缀自动机)

    3926: [Zjoi2015]诸神眷顾的幻想乡 Time Limit: 10 Sec   Memory Limit: 512 MB Submit: 1009   Solved: 596 [ Subm ...

  7. [ZJOI2015] 诸神眷顾的幻想乡

    P3256[ZJOI2015 Day1]诸神眷顾的幻想乡 时间限制 : 20000 MS   空间限制 : 524288 KB 问题描述 幽香是全幻想乡里最受人欢迎的萌妹子,这天,是幽香的2600岁生 ...

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

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

  9. [洛谷P3346][ZJOI2015]诸神眷顾的幻想乡

    题目大意:给你一棵$n$个点的树,最多有$20$个叶子节点,问共有几个不同的子串 题解:广义$SAM$,对每个叶子节点深搜一次,每个节点的$lst$设为这个节点当时的父亲,这样就可以时建出来的$SAM ...

最新文章

  1. 单片机定时器精准定时_8051单片机(STC89C52)定时器实现10ms精准定时
  2. startActivities的使用
  3. 起步难、评职称难、压力大!青年科研人员“心病”问题亟待关注!
  4. linux 脚本 if判断 o,shell脚本常用脚本:if判断
  5. Magento教程 20:仅限会员留言的产品评论设定!
  6. Java—线程的生命周期及线程控制方法详解
  7. 谷歌浏览器实现直接打印效果
  8. Java_String
  9. 重启nginx后丢失nginx.pid的解决方法
  10. AI辅助构建知识图谱:关系抽取
  11. 编写可靠Linux shell脚本的建议
  12. 软件基本功:代码创新要不得:for循环判断一个字符是不是数字字符
  13. 中国十大名牌直流稳压电源
  14. 越有钱越抠门 李嘉诚西装一穿就是十年
  15. 服务器硬件配置及RAID配置操作
  16. 日期格式化跨年bug,是否与你不期而遇?
  17. 为什么游戏模型不如原画好看?
  18. php ecb加密,PHP之DES加密解密算法类(ECB模式)(实例教程)
  19. NXP-MPC5748G车载MCU使用(食用)方法(踩坑)实用指南(骗人教程)(三):MATLAB/SIMULINK生成代码给MPC5848G嵌入式处理器运行
  20. Linux下gunicorn用法

热门文章

  1. java机甲类回合制游戏,2018经典机甲游戏有哪些_好玩的机甲类游戏推荐
  2. 用html做一个可以拨打电话的链接
  3. python [::-1] [::-1,::-1]
  4. el-table怎么设置单个表格变颜色
  5. 【报错】1366-Incorrect string value:\xE6\x9D\x8E\xE5\xAD\xA6...for column name at row 1
  6. 学海无涯!回头是岸!
  7. 实验吧_拐弯抹角(url伪静态)Forms
  8. [CF444E]DZY Loves Planting
  9. qq 飞信中无法切换输入法
  10. CTF pwn/re手在学习过程中的零碎操作积累