bzoj 3926

 

后缀自动机扩展到树形结构上。

先建出大的Trie,然后我们得到了一棵Trie树,对于树上的每个节点,保存一个后缀自动机从根走它代表的字符串后到达的节点,每次其儿子就从父亲的这个节点开始扩展。

  1 /**************************************************************
  2     Problem: 3926
  3     User: idy002
  4     Language: C++
  5     Result: Accepted
  6     Time:4320 ms
  7     Memory:460976 kb
  8 ****************************************************************/
  9  
 10 #include <cstdio>
 11 #include <cassert>
 12 #include <cstring>
 13 #include <algorithm>
 14 #define N 100010
 15 #define ST 3000100
 16 #define SS ST<<1
 17 using namespace std;
 18  
 19 typedef long long dnt;
 20  
 21 int qu[SS], stk[SS], bg, ed, top;
 22  
 23 struct Sam {
 24     int son[SS][10], val[SS], pnt[SS], ntot;
 25     Sam() { pnt[0] = -1; };
 26     int append( int p, int c ) {
 27         int np = ++ntot;
 28         val[np] = val[p]+1;
 29         while( p!=-1 && !son[p][c] ) 
 30             son[p][c]=np, p=pnt[p];
 31         if( p==-1 ) {
 32             pnt[np] = 0;
 33         } else {
 34             int q=son[p][c];
 35             if( val[q]==val[p]+1 ) {
 36                 pnt[np] = q;
 37             } else {
 38                 int nq = ++ntot;
 39                 memcpy( son[nq], son[q], sizeof(son[nq]) );
 40                 val[nq] = val[p]+1;
 41                 pnt[nq] = pnt[q];
 42                 pnt[q] = pnt[np] = nq;
 43                 while( p!=-1 && son[p][c]==q )
 44                     son[p][c]=nq, p=pnt[p];
 45             }
 46         }
 47         return np;
 48     }
 49     dnt count() {
 50         dnt rt = 0;
 51         for( int u=1; u<=ntot; u++ ) 
 52             rt += val[u]-val[pnt[u]];
 53         return rt;
 54     }
 55 }sam;
 56 struct Trie {
 57     int son[ST][10], last[ST], ntot;
 58     void insert( int *T ) {
 59         int u=0;
 60         for( int i=0; T[i]!=-1; i++ ) {
 61             int c=T[i];
 62             if( !(0<=T[i]&&T[i]<10) ) {
 63                 assert( T[i]>=0 && T[i]<=9 );
 64             }
 65             if( !son[u][c] ) son[u][c]=++ntot;
 66             u=son[u][c];
 67         }
 68     }
 69     void build() {
 70         last[0] = 0;
 71         qu[bg=ed=1] = 0;
 72         while( bg<=ed ) {
 73             int u=qu[bg++];
 74             for( int c=0; c<10; c++ ) {
 75                 int v=son[u][c];
 76                 if( !v ) continue;
 77                 last[v] = sam.append( last[u], c );
 78                 qu[++ed] = v;
 79             }
 80         }
 81     }
 82 }trie;
 83  
 84 int n, c;
 85 int head[N], wght[N], dest[N<<1], next[N<<1], etot;
 86 int dgr[N], fat[N];
 87  
 88 void adde( int u, int v ) {
 89     etot++;
 90     dest[etot] = v;
 91     next[etot] = head[u];
 92     head[u] = etot;
 93 }
 94 void bfs( int s ) {
 95     qu[bg=ed=1] = s;
 96     fat[s] = 0;
 97     while( bg<=ed ) {
 98         int u=qu[bg++];
 99         for( int t=head[u]; t; t=next[t] ) {
100             int v=dest[t];
101             if( v==fat[u] ) continue;
102             qu[++ed] = v;
103             fat[v] = u;
104         }
105     }
106     for( int t=1; t<=top; t++ ) {
107         int u=stk[t];
108         bg=1, ed=0;
109         while( u ) {
110             qu[++ed] = wght[u];
111             u=fat[u];
112         }
113         reverse( qu+1, qu+1+ed );
114         qu[++ed] = -1;
115         trie.insert( qu+1 );
116     }
117 }
118 int main() {
119     scanf( "%d%d", &n, &c );
120     for( int i=1; i<=n; i++ ) 
121         scanf( "%d", wght+i );
122     for( int i=1,u,v; i<n; i++ ) {
123         scanf( "%d%d", &u, &v );
124         adde( u, v );
125         adde( v, u );
126         dgr[u]++, dgr[v]++;
127     }
128     for( int u=1; u<=n; u++ ) 
129         if( dgr[u]<=1 ) stk[++top] = u;
130     for( int t=1; t<=top; t++ ) 
131         bfs(stk[t]);
132     trie.build();
133     printf( "%lld\n", sam.count() );
134     return 0;
135 }
View Code

 

转载于:https://www.cnblogs.com/idy002/p/4520781.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/358816.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

java memcmp_memcmp,memicmp函数

函数原型&#xff1a;extern int memcmp(void *str1, void *str2, unsigned int n)参数说明&#xff1a;str1和str2为指定作比较的字符串&#xff0c;比较两个字符串的前n个字节。所在库名&#xff1a;#include 函数功能&#xff1a;比较字符串str1和str2在内存区域中的的前n个…

Pycharm社区版安装教程(永久免费,随时升级)

首先进入JetBrain的官网(国内正常访问): https://www.jetbrains.com/ 第一眼看到的界面如下图所示: 然后找到我们的Pycharm专题页: 进入Pycharm的专题页面之后,点击下载按钮(这里有两个按钮,点任何一个都行): 然后进入到真正的下载页面你会发现有两个版本的Pycharm,一个…

解决 invalid input detected at ‘^’ marker的问题

粉丝求助&#xff1a; 解决办法&#xff1a; Switch开不了机&#xff08;机器bai黑屏&#xff0c;如果找很黑的房间能看到屏du幕内部有zhi点透亮光&#xff09;&#xff1b; 解决方法&#xff1a;这dao是假死机&#xff0c;按住电源键12秒强制关机&#xff0c;然后再按电源键能…

PyCharm社区版设置简体中文界面

点击“File”&#xff0c;出现的菜单中点击“Settings”, 在弹出的界面中&#xff0c;选“Plugins”&#xff0c; 然后在右边输入框中输入“chinese”, 在搜索结果中&#xff0c;选中Chinese(Simplified) Language Pack&#xff0c;点击右边的“install”即可。

JMS和AWS SQS的更多高级内容

如您所知&#xff0c; AWS中的SQS SQS代表“简单队列服务”。 最近&#xff0c;在使用它的同时&#xff0c;我发现了将其称为“简单”的原因之一。 在之前的两篇文章&#xff08; 此处和此处 &#xff09;中&#xff0c;我展示了结合Spring Framework将SQS用作JMS队列提供程序 …

w10家庭版安装java不_小编为你分析win10系统安装不了java的设置办法

许多win10系统用户在工作中经常会遇到win10系统安装不了java的情况&#xff0c;想必大家都遇到过win10系统安装不了java的情况吧&#xff0c;那么应该怎么处理win10系统安装不了java呢&#xff1f;我们依照1、查看自己的电脑是32位的还是64位的(x86代表32位的)。java安装要求比…

用C语言实现津巴布韦这道算法题?

粉丝求助: 题目内容如下: 5、津巴布韦 由于计划经济失败,津巴布韦称为世界上通胀率最高的国家。这里的物价即使在一天中也会持续上涨,所以必须实时更新物品价格。例如:1个鸡蛋的价格为35亿津巴布韦元,所以超市做了每位数字的活动标价牌。 钟旭在穆加贝超市打工,有一天遇…

dnslog盲注

dnslog盲注dnslog注入原理DNSlog工具什么情况下使用dnslog注入&#xff1f;Mysql DNSlog原理图DNSlog盲注利用条件DNSlog盲注操作方式实战演练查询当前数据库名&#xff1a;查询当前数据库的第一个表名&#xff1a;查询第users表一个列名&#xff1a;查询users表的username列的…

Python在cmd中配置虚拟环境ERROR: Command errored out with exit status 1:

粉丝求助: 解决办法: 具体步骤: 1.查看Python版本 2.Pythonlibs 中找到对应版本的whl文件,cp37代表3.7版本,win32代表Windows系统32位机,根据自己的电脑位数选择。

java sqlserver ssl_拦截SQLSERVER的SSL加密通道替换传输过程中的用户名密码实现运维审计(一)...

工作准备•一台SQLSERVER 2005/SQLSERVER 2008服务•SQLSERVER jdbc驱动程序•Java开发环境eclipse jdk1.8•java反编译工具JD-Core反编译JDBC分析SQLSERVER客户端与服务器通信原理SQLServerConnection.class1、经过反编译分析SQLServerConnection.class文件我们可以看到登录时…

1-9其他数据库注入

文章目录 数据库注入access数据库判断access数据库常用函数查询语句构造联合查询布尔型盲注 mssql数据库mssql数据库判断环境---靶机-2k3_sp2常用函数查询语句构造联合查询报错注入布尔型盲注 数据库注入 access数据库 判断access数据库 根据url的后缀。ASP为后缀名…

自动化专业向往硬件方面靠,有什么好的建议?

我的建议是: 有能力考研就先考研,考不上可以选择就业,学历还是很重要的,门槛。自动化可以找一些相关的知名企业,按照他们的招聘要求要求自己,往这个方法发展,垂直领域研究很深,你就是大佬和专家。 有个帖子讲的挺全的,虽然是文章:自动化人生 下面是理论内容,我直接…

Linux下编译安装以及配置PHP环境

安装准备 依次执行下面命令,不存在的就搜差不多的就行,下面安装的都是后面安装环境可能需要用上的依赖,不管37是不是21,复制粘贴就是了 Ubuntu安装: sudo apt-get update sudo apt-get install gcc autoconf openssl libssl-dev curl libcurl4-gnutls-de…

有什么好一点的方法读jdk源码吗?

建议是: 1:找相关的书在看相关源码时应该对程序有整体了解,比如看虚拟机时至少要知道:垃圾回收算法,Java内存布局,class文件格式,加载连接的过程...很多人看源码一点头绪都没有,就是因为不了解对应的模块是干嘛的(比如Ja

给女朋友道歉的java代码_跟女朋友道歉的话,高情商的哄人句子

女朋友生气了&#xff0c;而且很严重。在这种情况下&#xff0c;不知道做什么挽回她。第一诚实的道歉可以缓和彼此紧张的气氛。重要的是&#xff0c;道歉完就需要说一些话语去哄她&#xff0c;至于怎么哄又是一个技术性的问题了&#xff0c;下面一起来看看跟女朋友道歉的话,高情…

使用Myeclipse完成Hibernate的逆向工程

Hibernate的开发流程一般有两种&#xff1a; 1、由Domain object > mapping > db 2、由db开始&#xff0c;用工具生成生成mapping 和Domain object。 在实际的开发过程中&#xff0c;涉及的表太多了&#xff0c;一个一个的写java实体类很费事费时的。Myeclipse提供了一个…

kali安装docker(有效详细的教程)

前记&#xff1a; 博主有着多次安装docker的丰富经验&#xff0c;曾经为了在kali成功安装docker花费不少时间。在kali2016.3一直到最新的kali2019.4都通吃&#xff01;所以跟着下面的步骤走&#xff0c;绝对不会出错。&#xff08;该机子此前没装过docker&#xff0c;并且配置好…

java中菜单分几级_JavaWeb三级菜单分类查询详解

废话不多说&#xff0c;直接贴代码&#xff1a;dao层代码&#xff1a;mapper&#xff1a;ListselectByParentId(Integer id);mapper.xmlselectfrom easybuy_product_categorywhere parentId #{parentId,jdbcTypeINTEGER}Test:import cn.hd.entity.ProductCategory;import cn.h…

使用Javaslang进行Java 8中的函数式编程

我们非常高兴地在jOOQ博客上宣布一个客座帖子&#xff0c;该帖子由HSH Nordbank的高级软件工程师&#xff0c;三个孩子的父亲&#xff0c; Daniel Dietrich撰写。 他目前作为项目负责人和首席开发人员为金融产品创建定价框架。 除工作外&#xff0c;他还对编程语言&#xff0c…

HFS远程命令执行漏洞复现

漏洞程序下载地址:Http File Server 这里说一下&#xff0c;在Windows server 2003中复现时&#xff0c;我直接使用Administrator用户登录&#xff0c;然后复现&#xff0c;未出现权限问题。再Windows 10中尝试复现时发现权限不足&#xff0c;需要以管理员权限执行漏洞程序。 运…