06 2014 档案
摘要:Ctsc2012的题目。做完感觉自己瞬间变高富帅了。不过回想其实也觉得不难,想到用单调队列就很简单了,还有二分= =。呵对于给出的一篇文章,如果你们将它分成若干段,并在所有长度不小于L的片段在字典中间出现的总长度和不小于原文的90%,那么这篇文章就可以被认为是熟悉的。这里要注意理解一下题意,如果你要...
阅读全文
摘要:若它的一个子串出现的次数不少于K次,那么这个子串就是一个K-string。现给出原串,每次可以向该串后面添加一个字符或者询问当前有多少个不同的K-string。在线添加查询,解法直指SAM。其实给添加函数直接设置一个返回值直接更新ans就好了。对于每个状态,多开一个值记录它的出现次数,每次添加点过后...
阅读全文
摘要:给一个原串,以及那些字符是坏的,现在问你可以从原串中取出多少个不同子串,使得其所含的坏字符的个数不超过一个定数。这个题目网上有各种各样的解法。如hash,tire。我说一下我的解法。解法一:后缀自动机dp。f[][]保存到达某个状态,前面已经有的坏字符的个数的时候的字符串数量。这样按照拓扑序列一直递...
阅读全文
摘要:很好的一个自动机的题目。给原串,和若干个询问串。求原串里有多少个不同子串可以通过询问串循环移动得到。有点类似求两个串的lcs,但是灵活一点。首先我们把询问串长度扩大一倍,去掉最后一个字符。因为最后那个字符结尾的情况已经有了。然后把这个新串拿到SAM中跑一遍,跑的过程就像求lcs差不多,每次判断长度l...
阅读全文
摘要:很好的一个题目。对于理解后缀自动机很有用。题目给你若干数字串,总长度不超过100000,任意一个串的任意一个子串都可以拿出来单独的作为一个数字。同一个数字只算一次。问所有不同数字的和为多少?嗯嗯嗯嗯嗯嗯嗯嗯嗯嗯嗯嗯嗯嗯嗯嗯嗯嗯嗯嗯嗯首先由于字符串的数字很多,我们可以把么多串连接成一个串,每个串用[1...
阅读全文
摘要:题目给出一个长为2000的字符串,和10000询问,每次询问从第l到第r个字符中间有多少个不同的子串。其实,全部预处理。f[i][j]表示从i到j个字符的子串数。重构2000遍SAM。对于新加入的字符,其所对应的last点,新增加的新子串数位step[last]-step[pre[last]]。原因...
阅读全文
摘要:题目意思是给你一个字符串,f[x]是长度为x的子串中,出现个数最多的那个串的出现次数。给出原串,依次输出f[1],f[2],……。后缀自动机。对于某一个状态,right[]值的大小就是出现的次数,而且是对于长为step[]的子串的出现次数。因为小于step值的串在前面已经加了,在pre指针线上面的状...
阅读全文
摘要:经典题目:给一个字符串,求字典序第k小的子串是什么。涉及子串问题,上自动机。首先我们可以用记忆化搜索的方法,求出到达某一个状态后,能产生多少个新状态。首先,到达这个状态就不走了,这肯定是一种状态,然后分别考虑后面的26个指针就好了。不过如果不记忆化肯定是要T的,而且如果用dp好像会有一点问题,因为状...
阅读全文
摘要:和上个题目差不多,这次是找若干个串的LCS,若干#include #define maxn 200100using namespace std;int next[maxn][26],pre[maxn],step[maxn];int f[13][maxn];int N=0,last=0,n=1;int...
阅读全文
摘要:经典题目,求两个串的最长公共子串。是这样来做的。以第一个串构造SAM,第二个串在自动机上跟新一遍就可以了。更新的过程是这样的,假设当前到达的状态点为x(初始状态为0点),下一个字符是c,如果当前状态没有c这条边就一直沿着pre指针走,直到找到第一个有c这条边的状态或者确认全部都没有。更新是这样的,用...
阅读全文
浙公网安备 33010602011771号