
后缀自动机
jzhang1
这个作者很懒,什么都没留下…
展开
-
后缀自动机
基础知识:step[i]表示的是字符串i在原字符串中的位置。Pareint[i]表示root到parent[i]的子串是root到i的最长后缀。后缀自动机遍历可以得到原字符串的所有子串。特殊技巧:一.后缀自动机的不同子串数有两种求法:1. Ans = step[i]–step[parent[i]] (12. Ans[i] = Ans[son[i]原创 2016-01-21 18:52:48 · 541 阅读 · 0 评论 -
bzoj2946公共串
题意:求n个字符串的最长公共子串。 我们先建出一个串的后缀自动机。考虑后缀自动机的一个性质就是到当前状态s的所有路径都是互相包含的,这说明了什么呢?我们设Ans[i]是i状态目前能够匹配到的最长长度,那么假设当前串在i匹配的长度是x,那么Ans[i] = min(Ans[i].x),能直接取min就是因为上面的兴致。所以我们现在的目的就是求出所有的Ans[i],再取max就行了。原创 2016-01-21 18:53:39 · 488 阅读 · 0 评论 -
bzoj3998
题意:给出字符串,求其中字典序第k小的子串。我们设Ans[s]为状态s之后一共有多少子串,这个在建完图之后倒叙更新一遍就可以了。#include#include#include#include#include#include#include#includeusing namespace std;int n,T,K;char s[1000010];struct node原创 2016-01-21 18:56:30 · 466 阅读 · 0 评论 -
bzoj3926诸神眷顾的幻想乡
题意:给出一棵树,每个节点上有一个字符,问整棵树一共多少不同的串?(保证叶子节点小于等于20)难点1在于怎么统计到所有的子串,直接统计肯定是不行的,我们注意到叶子节点小于等于20,我们考虑将每个叶子节点作为根把树给提起来,然后定义这棵树的子串为从上到下的一个串(深度从浅到深),首先我们发现这样可以不考虑树上子串的复杂问题了(因为是有序的),其次我们发现这样之后包含了树上的所有子串(虽然我不原创 2016-01-21 19:03:00 · 972 阅读 · 1 评论