上一页 1 2 3 4 5 6 7 8 ··· 65 下一页
摘要: 对trie建SAM,询问串倒过来跑到的节点的|right|即为答案。 阅读全文
posted @ 2019-05-08 15:12 Gloid 阅读(306) 评论(0) 推荐(0) 编辑
摘要: 将所有串(包括S)放一块建SAM。对于询问,倍增定位出该子串所在节点,然后要查询的就是该子串在区间内的哪个字符串出现最多。可以线段树合并求出该节点在每个字符串中的出现次数。 阅读全文
posted @ 2019-05-08 14:35 Gloid 阅读(204) 评论(0) 推荐(0) 编辑
摘要: 对作文库中的串建出广义SAM,然后显然可以二分答案,二分之后考虑暴力dp,设f[i]为前i位最长匹配长度,显然有f[i]=max(f[i-1],f[j]+i-j) (i-j>=l&&j+1~i能在作文库中匹配)。在SAM上跑并记录匹配长度,单调队列优化dp即可。 阅读全文
posted @ 2019-05-08 01:22 Gloid 阅读(181) 评论(0) 推荐(0) 编辑
摘要: 对多串建立SAM的一种方法是建trie再对trie建SAM。构造方式分为在线(也即不建trie而是依次插入每个串,或在trie上dfs)和离线(也即建好trie再bfs)。其中离线构造与单串的构造方式几乎没有区别,将父亲所在节点作为last即可,按bfs序建SAM可以避免出现要转移到的状态已经存在的 阅读全文
posted @ 2019-05-07 21:30 Gloid 阅读(381) 评论(0) 推荐(0) 编辑
摘要: 对多串建立SAM的一种方法是加分隔符。于是加完分隔符建出SAM。 考虑统计出每个节点被多少个串包含。让每个串各自在SAM上跑,跑到一个节点就标记(显然一定会完全匹配该节点,因为是对包含其的串建的SAM)并暴跳fail,遇到已经被该串标记过的点就停止。 这样暴力的复杂度容易感性证明是O(Lsqrt(L 阅读全文
posted @ 2019-05-06 23:41 Gloid 阅读(420) 评论(0) 推荐(0) 编辑
摘要: 先考虑没有动态加字符怎么做。计算每个节点的贡献,当|right|>=k时将len-lenfa计入即可。 动态加字符后,这个东西难以用LCT维护。于是考虑离线。建完SAM后,容易发现每个节点在时间上的一段后缀提供贡献,且具体时间就是其right集合中的第k小。主席树或线段树合并求出即可。 阅读全文
posted @ 2019-05-06 20:00 Gloid 阅读(214) 评论(0) 推荐(0) 编辑
摘要: 询问串放在SAM上不跳fail跑到的节点的|right|即为答案。用LCT维护parent树即可。可以直接维护子树信息,也可以转化为路径加。注意强制在线所使用的mask是作为参数传进去的。 阅读全文
posted @ 2019-05-06 16:45 Gloid 阅读(161) 评论(0) 推荐(0) 编辑
摘要: 先考虑l=1,r=n,并且不要求本质不同的情况。对原串建SAM,将询问串在上面跑,得到每个前缀的最长匹配后缀即可得到答案。 然后考虑本质不同。对询问串也建SAM,统计每个节点的贡献,得到该点right集合中任意一个的匹配长度即可。 然后考虑原问题。我们需要求的仍然只是每个前缀的最长匹配后缀。通过线段 阅读全文
posted @ 2019-05-06 13:39 Gloid 阅读(218) 评论(0) 推荐(0) 编辑
摘要: 对反串建SAM弄出后缀树,每个b串通过倍增定位其在后缀树上对应的节点,根据其长度将节点拆开。然后每个a串也找到对应的节点,由该节点向表示a串的节点连边,再把所给的边连上跑拓扑排序即可。 阅读全文
posted @ 2019-05-05 20:23 Gloid 阅读(215) 评论(3) 推荐(1) 编辑
摘要: A:开场就读错题。读对了之后也没啥好说的。 B:swap(1B,1D)。花了1h+仍然没有比暴力更好的做法,于是信仰交了暴力神tmpp了,最后居然似乎是因为用了map或者randomshuffle而fst,更加纯粹的暴力反而过了。无法想到的结论是,如果有解,一定存在某个解k是n的因子。考虑反证,如果 阅读全文
posted @ 2019-05-05 11:35 Gloid 阅读(300) 评论(0) 推荐(0) 编辑
上一页 1 2 3 4 5 6 7 8 ··· 65 下一页