因为题目中树的特殊性暴力dfs建sam就好了。然后sam有一个有意思的性质是一个点代表的子串个数等于mx[i]-mx[fail[i]],至于为什么,我不会严谨的证明,但想想还是可以的,就是当前串的所有后缀减去前面已经表示过的后缀吗。其实这个个数也可以一个dp跑出来的,只不过这种方法更卓越。

  1. #include<iostream>
  2. #include<cmath>
  3. #include<cstring>
  4. #include<cstdio>
  5. #include<algorithm>
  6. using namespace std;
  7. const int maxn=;
  8. int ss[maxn],ch[maxn*][],fa[maxn*],dis[maxn*],cur=,cnt=;
  9. int n,last[maxn],pre[maxn],other[maxn],cc[maxn],du[maxn],C,t;
  10. int add(int c,int p){
  11. cur=++cnt;
  12. dis[cur]=dis[p]+;
  13. for(;p&&!ch[p][c];p=fa[p])ch[p][c]=cur;
  14. if(!p)fa[cur]=;
  15. else{
  16. int q=ch[p][c];
  17. if(dis[q]==dis[p]+)fa[cur]=q;
  18. else{
  19. int nt=++cnt;dis[nt]=dis[p]+;
  20. memcpy(ch[nt],ch[q],sizeof(ch[]));
  21. fa[nt]=fa[q];fa[q]=fa[cur]=nt;
  22. for(;p&&ch[p][c]==q;p=fa[p])ch[p][c]=nt;
  23. }
  24. }
  25. return cur;
  26. }
  27. void dfs(int x,int fa,int p){
  28. int tmp=add(cc[x],p);
  29. for(int i=last[x];i;i=pre[i]){
  30. int v=other[i];
  31. if(v==fa)continue;
  32. dfs(v,x,tmp);
  33. }
  34. }
  35. void insert(int x,int y){++t;pre[t]=last[x];last[x]=t;other[t]=y;}
  36. int main(){
  37. int x,y;
  38. cin>>n>>C;
  39. for(int i=;i<=n;++i)scanf("%d",&cc[i]);
  40. for(int i=;i<n;++i){
  41. scanf("%d%d",&x,&y);
  42. du[x]++;du[y]++;
  43. insert(x,y);insert(y,x);
  44. }
  45. for(int i=;i<=n;++i)if(du[i]==){
  46. dfs(i,,);
  47. }
  48. long long ans=;
  49. for(int i=;i<=cnt;++i)
  50. ans+=dis[i]-dis[fa[i]];
  51. cout<<ans;
  52. //system("pause");
  53. return ;
  54. }

bzoj3929(sam)的更多相关文章

  1. SAM初探

    SAM,即Suffix Automaton,后缀自动机. 关于字符串有很多玩法,有很多算法都是围绕字符串展开的.为什么?我的理解是:相较于数字组成的序列,字母组成的序列中每个单位上元素的个数是有限的. ...

  2. bzoj4199:NOI2015D2T2品酒大会(SAM版)

    SAM感觉写起来比SA更直观(?) #include <iostream> #include <cstdio> #include <cstring> #includ ...

  3. SAM/BAM文件处理

    当测序得到的fastq文件map到基因组之后,我们通常会得到一个sam或者bam为扩展名的文件.SAM的全称是sequence alignment/map format.而BAM就是SAM的二进制文件 ...

  4. hihocoder SAM基础概念

    后缀自动机一·基本概念 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 小Hi:今天我们来学习一个强大的字符串处理工具:后缀自动机(Suffix Automaton,简称 ...

  5. bam/sam格式说明

    在SAM输出的结果中每一行都包括十二项通过Tab分隔,从左到右分别是: 1 序列的名字(Read的名字) 2 概括出一个合适的标记,各个数字分别代表 1     序列是一对序列中的一个 2     比 ...

  6. mismatch位置(MD tag)- sam/bam格式解读进阶

    这算是第二讲了,前面一讲是:Edit Distance编辑距离(NM tag)- sam/bam格式解读进阶 MD是mismatch位置的字符串的表示形式,貌似在call SNP和indel的时候会用 ...

  7. Edit Distance编辑距离(NM tag)- sam/bam格式解读进阶

    sam格式很精炼,几乎包含了比对的所有信息,我们平常用到的信息很少,但特殊情况下,我们会用到一些较为生僻的信息,关于这些信息sam官方文档的介绍比较精简,直接看估计很难看懂. 今天要介绍的是如何通过b ...

  8. pysam - 多种格式基因组数据(sam/bam/vcf/bcf/cram/…)读写与处理模块(python)

    在开发基因组相关流程或工具时,经常需要读取.处理和创建bam.vcf.bcf文件.目前已经有一些主流的处理此类格式文件的工具,如samtools.picard.vcftools.bcftools,但此 ...

  9. SAM格式 及 比对工具之 samtools 使用方法

    参考资料: SAMtools(官网) SAM Spec v1.4 (SAM格式 说明书) (重要) samtools-1.3.1 使用手册 (SAMtools软件说明书) samtools常用命令详解 ...

随机推荐

  1. k8s学习笔记之二:使用kubeadm安装k8s集群

    一.集群环境信息及安装前准备 部署前操作(集群内所有主机): .关闭防火墙,关闭selinux(生产环境按需关闭或打开) .同步服务器时间,选择公网ntpd服务器或者自建ntpd服务器 .关闭swap ...

  2. 有哪些你不知道的python小工具

    python作为越来越流行的一种编程语言,不仅仅是因为它语言简单,有许多现成的包可以直接调用. python中还有大量的小工具,让你的python工作更有效率. 1.- 快速共享 - HTTP服务器 ...

  3. 【Linux】【Jenkins】编译过程中遇到ERROR: Failed to parse POMs的解决方案

    自动化构建的时候报错,网搜查询说是maven的jenkinks配置问题导致的.修改系统工具配置的maven配置就可以了 Started by user XX Building in workspace ...

  4. JavaScript获取、修改CSS样式合辑

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  5. Docker 安装 oracle 并使用 navicat 实现外部连接

    1,拉取 docker 镜像:docker pull registry.cn-hangzhou.aliyuncs.com/helowin/oracle_11g 1.1 , 该镜像由阿里云提供,比较大, ...

  6. python入门学习1

    实学习每一种语言,都可以找到很快乐的学习方法.有兴趣,有乐趣,才会一直想学.知道print().input().if/else就可以做一个简陋的游戏了. print() # 打印函数,将信息打印出来 ...

  7. maven学习-基本入门用法

    一.下载及安装 1.1 下载maven 3.1.1 先到官网http://maven.apache.org/download.cgi 下载最新版本(目前是3.1.1 ),下载完成后,解压到某个目录(本 ...

  8. .Net 中读写Oracle数据库常用两种方式

    .net中连接Oracle 的两种方式:OracleClient,OleDb转载 2015年04月24日 00:00:24 10820.Net 中读写Oracle数据库常用两种方式:OracleCli ...

  9. SpringBoot打成jar包的配置方式

    pom.xml中添加Springboot插件 <build> <plugins> <plugin> <groupId>org.springframewo ...

  10. 坑之mysql 字符串与数字操作

    select "123"+1 = 124; select "1a23"+1 = 2; select "aa23"+1 = 1; select ...