• 题解:

    • 如果树上某个路径串的端点不是叶子,那么一定是另一个串的子串;
    • 这样只对叶子$dfs$把$20*20$个串插入广义$SAM$就是统计本质不同的串的个数的模板了;
    • 我不太会分析广义$SAM$的空间,但是我知道似乎完全图是有$n-1$条欧拉回路的,所以长度不会超过$2n*(20-1)$,需要卡一卡;
    • 可能后面会补广义的坑吧。。。。
    •  #include<bits/stdc++.h>
      #define rg register
      #define il inline
      #define ll long long
      using namespace std;
      const int N=,M=;
      int n,m,sz,mx[N*M],pa[N*M],s[N],len,col[N],ch[N*M][],d[N],cnt,a[N],w[N],st[N*M],o,hd[N];
      ll val[N*M];
      struct Edge{int v,nt;}E[N<<];
      il char gc(){
      static char*p1,*p2,S[];
      if(p1==p2)p2=(p1=S)+fread(S,,,stdin);
      return(p1==p2)?EOF:*p1++;
      }
      il int rd(){
      int x=;char c=gc();
      while(c<''||c>'')c=gc();
      while(c>=''&&c<='')x=(x<<)+(x<<)+c-'',c=gc();
      return x;
      }
      il void adde(int u,int v){
      E[o]=(Edge){v,hd[u]};hd[u]=o++;d[u]++;
      E[o]=(Edge){u,hd[v]};hd[v]=o++;d[v]++;
      }
      il void ins(){
      /*
      for(int i=1;i<=len;i++)printf("%d ",s[i]);
      puts("");
      */
      int lst=,np,nq,p,q,x;
      for(rg int i=;i<=len;i++){
      x=s[i];
      p=lst; mx[lst=np=++sz]=mx[p]+;
      while(p&&!ch[p][x])ch[p][x]=np,p=pa[p];
      if(!p){pa[np]=;continue;}
      q=ch[p][x];
      if(mx[q]==mx[p]+)pa[np]=q;
      else {
      mx[nq=++sz]=mx[p]+;
      memcpy(ch[nq],ch[q],sizeof(ch[q]));
      pa[nq]=pa[q];pa[q]=pa[np]=nq;
      while(p&&ch[p][x]==q)ch[p][x]=nq,p=pa[p];
      }
      }
      }
      il void dfs(int u,int fa){
      for(rg int i=hd[u];i;i=E[i].nt){
      int v=E[i].v;
      if(v==fa)continue;
      s[++len]=col[v];
      dfs(v,u);
      }
      if(d[u]==&&fa)ins();
      len--;
      }
      int main(){
      #ifndef ONLINE_JUDGE
      freopen("bzoj3926.in","r",stdin);
      freopen("bzoj3926.out","w",stdout);
      #endif
      n=rd();m=rd();
      for(rg int i=;i<=n;i++)col[i]=rd();
      for(rg int i=o=;i<n;i++)adde(rd(),rd());
      sz=;
      for(rg int i=;i<=n;i++)if(d[i]==)a[++cnt]=i;
      for(int i=;i<=cnt;i++){
      s[len=]=col[a[i]];
      dfs(a[i],);
      }
      for(rg int i=;i<=sz;i++)w[mx[i]]++;
      for(rg int i=;i<=n;i++)w[i]+=w[i-];
      for(rg int i=sz;i;i--)st[w[mx[i]]--]=i;
      for(rg int i=sz,u;i;i--){
      val[u=st[i]]=;
      for(rg int j=;j<m;j++){
      val[u]+=val[ch[u][j]];
      }
      }
      --val[];
      printf("%lld\n",val[]);
      return ;
      }

      bzoj3926

【bzoj3926】【Zjoi2015】诸神眷顾的幻想乡的更多相关文章

  1. bzoj3926: [Zjoi2015]诸神眷顾的幻想乡 对[广义后缀自动机]的一些理解

    先说一下对后缀自动机的理解,主要是对构造过程的理解. 构造中,我们已经得到了前L个字符的后缀自动机,现在我们要得到L+1个字符的后缀自动机,什么需要改变呢? 首先,子串$[0,L+1)$对应的状态不存 ...

  2. BZOJ3926 [Zjoi2015]诸神眷顾的幻想乡 字符串 SAM

    原文链接https://www.cnblogs.com/zhouzhendong/p/BZOJ3926.html 题目传送门 - BZOJ3926 题意 给定一个有 $n$ 个节点,最多只有 $20$ ...

  3. BZOJ3926:[ZJOI2015]诸神眷顾的幻想乡(广义SAM)

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

  4. [BZOJ3926][ZJOI2015]诸神眷顾的幻想乡(后缀自动机)

    日,无数幽香的粉丝到了幽香家门前的太阳花田上来为幽香庆祝生日. 粉丝们非常热情,自发组织表演了一系列节目给幽香看.幽香当然也非常高兴啦.  这时幽香发现了一件非常有趣的事情,太阳花田有n块空地.在过去 ...

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

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

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

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

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

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

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

    对多串建立SAM的一种方法是建trie再对trie建SAM.构造方式分为在线(也即不建trie而是依次插入每个串,或在trie上dfs)和离线(也即建好trie再bfs).其中离线构造与单串的构造方式 ...

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

    #include <iostream> #include <cstdio> #include <cstring> #include <cmath> #i ...

  10. BZOJ3926 ZJOI2015 诸神眷顾的幻想乡 Trie、广义SAM

    传送门 树上的任意一条路径一定会在以某一个叶子节点为根的树上成为一条直上直下的链,而总共只有\(20\)个叶子节点. 于是每一次选所有叶子节点中的一个作为根,形成一个\(Trie\),把\(20\)个 ...

随机推荐

  1. 【Py大法系列--01】20多行代码生成你的微信聊天机器人

    前言 近期Stack Overflow公布了一项调查显示,Python已经成了发展最快的主流编程语言,Python搭乘着数据科学和机器学习以及人工智能的浪潮,席卷了整个技术圈.越来越多的人想了解.想学 ...

  2. MathExam6378

    我的第一个程序 一.预估与实际 PSP2.1 Personal Software Process Stages 预估耗时(分钟) 实际耗时(分钟) Planning 计划 15 10 • Estima ...

  3. Beta Scrum Day 2 — 听说

    听说

  4. 【搜索】POJ-2718 全排列+暴力

    一.题目 Description Given a number of distinct decimal digits, you can form one integer by choosing a n ...

  5. DPDK skeleton basicfwd 源码阅读

    学习这个例子用于理解单纯的 dpdk 转发过程,L2 和 L3 的转发是基于此:在rte_eth_rx_burst()收包后进行解包,提取 mac.ip 等信息然后在转发到输出网卡. 如果要写出自己的 ...

  6. 团队作业5-Alpha版本测试报告(彼岸芳华队)

    请根据团队项目中软件的需求文档.功能说明.系统设计和测试计划,写出软件的测试过程和测试结果,并回答下述问题. 一.在测试过程中总共发现了多少Bug?每个类别的Bug分别为多少个?(10分) 在测试过程 ...

  7. YFCC 100M数据集分析笔记

    --从YFCC 100M数据集中筛选出Geo信息位于中国的数据集 1.YFCC 100M简介 YFCC 100M数据库是2014年来基于雅虎Flickr的影像数据库.该库由1亿条产生于2004年至20 ...

  8. Python模块Scrapy导入出错:ImportError: cannot import name xmlrpc_client

    Mac(OS version: OS X Yosemite 10.10.5)上安装Scrapy模块,使用时出现: from six.moves import xmlrpc_client as xmlr ...

  9. [转帖]认识固态:SSD硬盘内外结构解析

    认识固态:SSD硬盘内外结构解析 来自: 中关村在线 收藏 分享 邀请 固态硬盘(Solid State Drive),简称固态盘(SSD),是用固态电子存储芯片阵列而制成的硬盘,由控制单元和存储单元 ...

  10. [转帖]Docker五种存储驱动原理及应用场景和性能测试对比

    Docker五种存储驱动原理及应用场景和性能测试对比 来源:http://dockone.io/article/1513 作者: 陈爱珍 布道师@七牛云   Docker最开始采用AUFS作为文件系统 ...