<?xml version="1.0" encoding="utf-8" ?><rss version="2.0"><channel><title><![CDATA[ALXPCUN的博客]]></title><description><![CDATA[]]></description><link>https://blog.youkuaiyun.com/ALXPCUN</link><language>zh-cn</language><generator>https://blog.youkuaiyun.com/</generator><copyright><![CDATA[Copyright &copy; ALXPCUN]]></copyright><item><title><![CDATA[BZOJ3653——谈笑风生(dfs序 && 树状数组)]]></title><link>https://blog.youkuaiyun.com/ALXPCUN/article/details/51453918</link><guid>https://blog.youkuaiyun.com/ALXPCUN/article/details/51453918</guid><author>ALXPCUN</author><pubDate>Thu, 19 May 2016 15:11:05 +0800</pubDate><description><![CDATA[现在有一颗以 1 为根的有根树，有
m 个询问，每次给定a, k, 求满足条件的三元组(a, b, c)(a 就是已经给定的那个)，条件：1、a, b距离不超过 k，2、a，b都是c的祖先。
首先比较显然的是需要分类：
a). b 在
a 的上面所构成的三元组，显然这样的可以直接统计出来，即 min(dep[a], k) * (size[a] - 1)，每一个上面的和 a
的子树中每个点]]></description><category></category></item><item><title><![CDATA[Treap——题目方法总结]]></title><link>https://blog.youkuaiyun.com/ALXPCUN/article/details/51422707</link><guid>https://blog.youkuaiyun.com/ALXPCUN/article/details/51422707</guid><author>ALXPCUN</author><pubDate>Mon, 16 May 2016 10:10:50 +0800</pubDate><description><![CDATA[一、查询整体区间第K大 && 序列中比 x 小的数的个数
例题：spoj3273.ORDERSET——初始一个空序列，支持插入、删除一个数，查询整个序列中的第K大和整个序列中小于x的数的个数。
难度：**
这是Treap的模版题，操作也都是基本操作，不错的一道模版题，但是spoj实在太慢了...写不好会莫名TLE
#include   
#include   
#include   
#d]]></description><category></category></item><item><title><![CDATA[BZOJ 2251.[2010Beijing Wc]外星联络(Trie)]]></title><link>https://blog.youkuaiyun.com/ALXPCUN/article/details/51259597</link><guid>https://blog.youkuaiyun.com/ALXPCUN/article/details/51259597</guid><author>ALXPCUN</author><pubDate>Wed, 27 Apr 2016 11:19:28 +0800</pubDate><description><![CDATA[给定一个01串，输出子串出现次数大于1次的次数，按子串的字典序输出。
首先应该知道：把一个字符串的后缀依次加入Trie树中，用Trie树就能不重不漏的表示这个字符串的所有后缀，而且按这棵Trie树dfs的顺序得到的后缀就是字典序的。这样直接统计就可以了。
CODE:
#include 
#include 
#include 

using namespace std;

const int ]]></description><category></category></item><item><title><![CDATA[练习——后缀数组题目]]></title><link>https://blog.youkuaiyun.com/ALXPCUN/article/details/51258342</link><guid>https://blog.youkuaiyun.com/ALXPCUN/article/details/51258342</guid><author>ALXPCUN</author><pubDate>Wed, 27 Apr 2016 09:03:50 +0800</pubDate><description><![CDATA[BZOJ 1717
题意：给一个字符串，求最长的出现至少K次的子串，子串可以重叠。
难度：*
和模型一样，直接上。
CODE：
#include 
#include 
#include 

using namespace std;

const int MAX_N = 20005;

int n, K, a[MAX_N];

void init()
{
	scanf("%d%d", &n]]></description><category></category></item><item><title><![CDATA[梳理——后缀数组应用]]></title><link>https://blog.youkuaiyun.com/ALXPCUN/article/details/51232798</link><guid>https://blog.youkuaiyun.com/ALXPCUN/article/details/51232798</guid><author>ALXPCUN</author><pubDate>Mon, 25 Apr 2016 08:45:03 +0800</pubDate><description><![CDATA[// 难度从 * ~ ***** 递增，*为简单
2016.03.4.24
1. POJ 2774
题意：给两个长度不超过 100000 的字符串，求他们的最长公共子串。
难度：*
算法&&技巧：字符串拼接， 后缀数组，找 Height 数组中最大的（注意特判两个是否属于不同字符串）]]></description><category></category></item><item><title><![CDATA[bzoj2434(NOI2011).阿狸的打字机(AC自动机 && DFS序 && 树状数组)]]></title><link>https://blog.youkuaiyun.com/ALXPCUN/article/details/51219795</link><guid>https://blog.youkuaiyun.com/ALXPCUN/article/details/51219795</guid><author>ALXPCUN</author><pubDate>Fri, 22 Apr 2016 14:28:55 +0800</pubDate><description><![CDATA[阿狸喜欢收藏各种稀奇古怪的东西，最近他淘到一台老式的打字机。打字机上只有28个按键，分别印有26个小写英文字母和 'B'、'P'两个字母。经阿狸研究发现，这个打字机是这样工作的：
l 输入小写字母，打字机的一个凹槽中会加入这个字母(这个字母加在凹槽的最后)。
l 按一下印有'B'的按键，打字机凹槽中最后一个字母会消失。
l 按一下印有'P'的按键，打字机会在纸上打印出凹槽中现有的所有字母并换]]></description><category></category></item><item><title><![CDATA[bzoj3172.单词(AC自动机)]]></title><link>https://blog.youkuaiyun.com/ALXPCUN/article/details/51219734</link><guid>https://blog.youkuaiyun.com/ALXPCUN/article/details/51219734</guid><author>ALXPCUN</author><pubDate>Fri, 22 Apr 2016 14:11:31 +0800</pubDate><description><![CDATA[有 N 
个单词组成了一篇文章，求每个单词在这篇文章中出现了多少次。
多个字符串匹配的问题，建立AC自动机。如果某个单词在 i 节点出现了，那么在 i 节点
fail 指针所指节点也出现过。
CODE: 
#include 
#include 

using namespace std;

const int MAX_N = 1000005;

struct Trie {
	int ch]]></description><category></category></item><item><title><![CDATA[hdu2243.考研路茫茫——单词情结(Trie图 && 矩阵乘法)]]></title><link>https://blog.youkuaiyun.com/ALXPCUN/article/details/51217002</link><guid>https://blog.youkuaiyun.com/ALXPCUN/article/details/51217002</guid><author>ALXPCUN</author><pubDate>Fri, 22 Apr 2016 08:31:03 +0800</pubDate><description><![CDATA[背单词，始终是复习英语的重要环节。在荒废了3年大学生涯后，Lele 也终于要开始背单词了。一天，Lele 在某本单词书上看到了一个根据词根来背单词的方法。比如"ab",放在单词前一般表示"相反，变坏，离去"等。



于是Lele想，如果背了
N 个词根，那这些词根到底会不会在单词里出现呢。更确切的描述是：长度不超过L , 只由小写字母组成的，至少包含一个词根的单词，一共可能有多少个呢？]]></description><category></category></item><item><title><![CDATA[poj2778.DNA Sequence (Trie图 && 矩阵乘)]]></title><link>https://blog.youkuaiyun.com/ALXPCUN/article/details/51216984</link><guid>https://blog.youkuaiyun.com/ALXPCUN/article/details/51216984</guid><author>ALXPCUN</author><pubDate>Fri, 22 Apr 2016 08:20:13 +0800</pubDate><description><![CDATA[有一些病毒串，求长度为 L
的且不包含任意一个病毒串的字符串数量。
首先多串匹配，所以要建立 
Trie 图（AC自动机）。而 L 很大，我们需要一个 O(log n) 的算法。考虑要得到一个长度为
n 的字符串，也就是在 Trie 图上走了 n 步。是不是似曾相识，很自然地就能想到矩阵乘法：首先根据
Trie图 求出 mat[ i ][ j ] ，表示从 i 节点到
j 节点走一步能]]></description><category></category></item><item><title><![CDATA[POJ3691.DNA repair (Trie图 && DP)]]></title><link>https://blog.youkuaiyun.com/ALXPCUN/article/details/51212599</link><guid>https://blog.youkuaiyun.com/ALXPCUN/article/details/51212599</guid><author>ALXPCUN</author><pubDate>Thu, 21 Apr 2016 20:25:34 +0800</pubDate><description><![CDATA[给你若干个字符串，再给你一个字符串 T ，求最少修改
T 中的多少个字符，能使 T 不包含给出的若干个字符串。
首先是多串匹配问题，所以我们自然而然地想到了
AC 自动机。然后考虑 DP：f[ i ][ j ] 表示查找第
i 个字符时在自动机上的状态为 j 的答案， 然后枚举下一次转移的字符，如果下一次转移的字符和
T 下一位要匹配的一样且不是病毒串，那么答案不变，否则答案 + 1，当]]></description><category></category></item><item><title><![CDATA[SPOJ3273.ORDERSET(Treap 模版)]]></title><link>https://blog.youkuaiyun.com/ALXPCUN/article/details/50822268</link><guid>https://blog.youkuaiyun.com/ALXPCUN/article/details/50822268</guid><author>ALXPCUN</author><pubDate>Mon, 07 Mar 2016 21:00:59 +0800</pubDate><description><![CDATA[一个空序列，支持过插入一个数，删除一个数，要查询当前序列第 k 大是哪个数，或者比 x 小的数有几个。
Treap 模版题
#include 
#include 
#include 
#define inf 1500000000

using namespace std;

typedef long long LL;
const int N = 300005;

struct treap {]]></description><category></category></item><item><title><![CDATA[HNOI2007.BZOJ1189.紧急疏散(最大流 && 二分)]]></title><link>https://blog.youkuaiyun.com/ALXPCUN/article/details/50727791</link><guid>https://blog.youkuaiyun.com/ALXPCUN/article/details/50727791</guid><author>ALXPCUN</author><pubDate>Wed, 24 Feb 2016 09:36:07 +0800</pubDate><description><![CDATA[有一个 N * M 的矩形区域，每个格子如果是 ‘ .
’ 则此处有一个人，如果是 ‘ D ’ 则这里是门（门只出现在边界上），否则这里就是墙。每个人可以在单位 1 的时间走到与其相邻的上下左右任意一个格子里，也可以不动。每个格子可以站无数个人，但是每扇门每一个单位时间只能出去一个人，问所有人离开这个矩形区域所需最短时间，如果不行，输出 ‘ impossible ' 。
二分时间，再用网络流判]]></description><category></category></item><item><title><![CDATA[2011清华集训.BZOJ2561 && THU A1277.最小生成树(最小割)]]></title><link>https://blog.youkuaiyun.com/ALXPCUN/article/details/50723032</link><guid>https://blog.youkuaiyun.com/ALXPCUN/article/details/50723032</guid><author>ALXPCUN</author><pubDate>Tue, 23 Feb 2016 14:43:50 +0800</pubDate><description><![CDATA[有一个 n 个点， m 条边的图，现在多加入一条边 ，求最少要删去多少条边，才能使边
 既可能出现在最小生成树上，也可能出现在最大生成树上。
设后加入的边的长度为 L，那么只有原图中小于 L
的边不能再用的时候， 才可能出现在最小生成树上，用最小割可求。最大生成树时同理。两次答案相加。
#include 
#include 
#include 

using namespace std;
]]></description><category></category></item><item><title><![CDATA[bzoj1717.产奶的模式]]></title><link>https://blog.youkuaiyun.com/ALXPCUN/article/details/50483351</link><guid>https://blog.youkuaiyun.com/ALXPCUN/article/details/50483351</guid><author>ALXPCUN</author><pubDate>Fri, 08 Jan 2016 15:41:41 +0800</pubDate><description><![CDATA[给出一个长度为 n 的数字序列和一个 K，求最长的出现了至少 K 次的子序列的长度。
经典问题，求出 Height 数组， 二分答案然后判断是否有一组的后缀个数大于等于 K。
#include 
#include 

using namespace std;

const int MAX_N = 20005;

int n, K, a[MAX_N], sa[MAX_N], r[MAX_N],]]></description><category></category></item><item><title><![CDATA[NOI2015.品酒大会(后缀数组)]]></title><link>https://blog.youkuaiyun.com/ALXPCUN/article/details/50482493</link><guid>https://blog.youkuaiyun.com/ALXPCUN/article/details/50482493</guid><author>ALXPCUN</author><pubDate>Fri, 08 Jan 2016 14:06:49 +0800</pubDate><description><![CDATA[给出一个 长度为 n 
的字符串，每一位有一个权值 val。定义两个位字符为 r 相似，是指分别从这两个字符开始，到后面的 r
个字符都相等。两个 r 相似的字符还有一个权值为这两个字符权值的乘积。问对于 r = 0, 1, 2, … , n - 1，统计出有多少种方法可以选出
2 个“r 相似”的字符，并回答选择 2 个”r
相似”的字符可以得到的权值的最大值。 
首先说一个暴力的做法]]></description><category></category></item><item><title><![CDATA[后缀数组应用——多个字符串的相关问题]]></title><link>https://blog.youkuaiyun.com/ALXPCUN/article/details/50480239</link><guid>https://blog.youkuaiyun.com/ALXPCUN/article/details/50480239</guid><author>ALXPCUN</author><pubDate>Fri, 08 Jan 2016 07:28:59 +0800</pubDate><description><![CDATA[1、不小于 K 个字符串中的最长子串(POJ 3294)
给出 n 个字符串，求在至少
K 个字符串中出现过的最长的子串
虽然是多个字符串，但是还是用老方法：将这
n 个字符串接在一起，中间用没有出现过且不重复的字符分隔开。求出 SA，Height 数组。二分答案，然后把后缀进行分组， 最后判断是否至少有一个组内有
K 个来自不同的字符串的后缀即可。时间复杂度 O( nlogn )。
]]></description><category></category></item><item><title><![CDATA[后缀数组应用——公共子串的个数]]></title><link>https://blog.youkuaiyun.com/ALXPCUN/article/details/50466746</link><guid>https://blog.youkuaiyun.com/ALXPCUN/article/details/50466746</guid><author>ALXPCUN</author><pubDate>Wed, 06 Jan 2016 09:32:30 +0800</pubDate><description><![CDATA[长度不小于 K 的公共子串的个数(POJ 3415)
给出两个字符串 S 和 T，求他们长度不小于给定
K 的公共子串的个数
首先把两个字符串拼接在一起，中间用一个没有出现过的字符做分隔符。求出新字符串的
SA， Height 数组，类似求重复子串的方法，按 K 把 Height 数组分组。分别对于
S 的每一个后缀， 求他前面有多少个 T 的后缀与其的公共前缀大于 K。但是这样直接做复]]></description><category></category></item><item><title><![CDATA[后缀数组应用——公共子串]]></title><link>https://blog.youkuaiyun.com/ALXPCUN/article/details/50462856</link><guid>https://blog.youkuaiyun.com/ALXPCUN/article/details/50462856</guid><author>ALXPCUN</author><pubDate>Tue, 05 Jan 2016 15:22:16 +0800</pubDate><description><![CDATA[最长公共子串(poj2774)
给出两个字符串，求出他们的最长公共子串
寻常的做法是 O( n )，或者 O( nlogn )。用后缀数组我们可以做到
O( n )，非常高效。首先我们知道任意一个子串都是原串的某个后缀的一个前缀，那么我们把两个串接在一起，中间用一个没有出现过的字符做分隔符。问题就转变成了这个新字符串的后缀的最长前缀。那么是不是只要找
Height 数组中最大的就可以了？？]]></description><category></category></item><item><title><![CDATA[后缀数组应用——回文子串]]></title><link>https://blog.youkuaiyun.com/ALXPCUN/article/details/50460094</link><guid>https://blog.youkuaiyun.com/ALXPCUN/article/details/50460094</guid><author>ALXPCUN</author><pubDate>Tue, 05 Jan 2016 09:02:22 +0800</pubDate><description><![CDATA[最长回文子串 (ural1297)
给出一个字符串 S，求出它的最长回文子串是什么。
当然，可以用 manacher 做，但是这篇要说的的是用后缀数组的做法：枚举每一位，求以这一位为中心的最长回文子串是什么。我们把原字符串反转并把它接在原字符串的后面，中间加入一个分隔符，这样问题就变成了求这个新的字符串的某两个后缀的最长公共前缀（如图）。注意回文子串为偶数和为奇数是两种情况，要区分一下。
总]]></description><category></category></item><item><title><![CDATA[后缀数组的应用——重复子串]]></title><link>https://blog.youkuaiyun.com/ALXPCUN/article/details/50455929</link><guid>https://blog.youkuaiyun.com/ALXPCUN/article/details/50455929</guid><author>ALXPCUN</author><pubDate>Mon, 04 Jan 2016 15:08:20 +0800</pubDate><description><![CDATA[重复子串：字符串 S 在字符串 T 中至少出现两次，则称 S 是 T 的重复子串


一、最长可覆盖的重复子串
只需求出字符串的 SA []，Height [] 数组，答案就是 Height 中最大的那个。
二、最长不可覆盖的重复子串 (POJ 1743)
求出 Height 数组，二分答案。问题就转变成了是否存在两个长度为 K 的相同字符串，且不重叠。按 K 分组，若 Height]]></description><category></category></item></channel></rss>