字符串
文章平均质量分 76
broxin
这个作者很懒,什么都没留下…
展开
-
Manacher算法
Manacher算法是用来求最长回文子串的。先回顾一下其他的高效做法。后缀数组可以在nlogn的复杂度求出来,方法是将字符串reverse过后加在原字符串的末尾,中间用一个没有出现过的字符隔开,然后分奇偶两种情况依次枚举中点,问题就转换为LCP问题,进而转换为RMQ问题。还有一种比较简洁的做法,分奇偶来二分长度,得到长度之后从两边跑,哈希出每一个长度固定的子串。nodgd证明过,当模的原创 2015-12-19 12:21:59 · 393 阅读 · 0 评论 -
[Noi2016十连测第二场]幻想(后缀平衡树)
题意:给一个字符串,三种操作,末尾插入一个字符,弹出末尾的字符,查询区间内一个给定字符串出现了多少次。卡常神题。。500万的数据规模什么鬼。。假如没有区间限制,就是后缀平衡树的裸题。查询一个字符串s出现了多少次,就是在后缀平衡树上找出由于替罪羊的删除不是很方便,这里可以用treap,删除一个节点的时候直接重构这个节点所在的子树。以前重构操作都是直接写在rotate里面的,用起来非常方便原创 2016-06-17 12:19:11 · 1526 阅读 · 0 评论 -
利用后缀数组构造后缀树
由于蒟蒻azui前段时间忙着准备省选,并在省选中成功闷声滚大粗,博客停更了好久。。原创 2016-04-24 19:06:49 · 3294 阅读 · 0 评论 -
COI2016 Palinilap(manacher+后缀数组)
题意:给出一个小写字母组成的字符串,修改一个字符(或者不改),使得字符串中所有回文串的长度之和最大(本质相同的回文串算多个)。好神的题。。题意简单易懂但是做起来非常麻烦。。以后如果只是求求lcp之类的最好写二分+hash,写个后缀数组简直是自讨苦吃。。很显然回文串的长度之和就是manacher算法中半径数组之和。修改一个字符有可能破坏一些回文串,也有可能引入一些新的回文串,只要我们原创 2016-05-31 22:04:18 · 637 阅读 · 0 评论 -
[BZOJ2160]拉拉队排练(回文树)
题意:求一个字符串的长度前k的奇数长度回文串的长度的乘积模一个数。和APIO那个回文串的题差不多,可以先manacher搞出所有本质不同的回文串,再用后缀数组查查出现了多少次即可。这里偷懒写的回文树,注意跑完了之后那个cnt需要沿着后缀链接向上传递一下。注意那个K是10^12不是10^9。。。开的int丢了5分,还好出题人比较良心只有一个点的K超了int。#include#inclu原创 2016-05-30 21:44:23 · 621 阅读 · 0 评论 -
BZOJ4310 跳蚤(后缀数组+二分答案)
题意:将一个字符串分成不超过K段,使得这K段中,所有子串中字典序最大的最小。即每一段当中取一个最大的子串,再在所有段的最大子串再取一个最大值,让这个最大值最小。长度10W。最大值最小,明显二分,但是乱二分是没前途的。要对所有本质不同的子串排名后二分,也就是你要能求出你二分出的第mid大的子串。这个可以用后缀数组来搞,先求出sum(n-sa[i]-height[i])作为不同子串的总数,求第原创 2016-02-24 00:41:40 · 2148 阅读 · 0 评论 -
[BZOJ4259] 残缺的字符串 (FFT)
题意:定义*号可匹配任意字符。给出A串,B串,求A串在B中完全匹配的所有位置。将*号视作0,则两个等长的串可匹配当且仅当Σ(a[i]-b[i])^2*a[i]*b[i]==0。将A串和B串最左边对齐,每次上式都要重算一次,不科学。所以讲A串先反转过来然后补上*号,就是卷积啦。原来的万径人踪灭一题当中用FFT来求了回文串,这里又能玩字符串匹配,真是太6了。#include#includ原创 2016-02-21 17:42:54 · 2259 阅读 · 0 评论 -
POJ2778 DNA sequence[自动AC机&矩阵快速幂]
题意:给定m个病毒的DNA序列(由AGCT组成),求长度为n的不包含病毒子串的DNA序列由多少个(模1e9+7),范围m题解:如果一个点走到下一个点就构成病毒,则这条边为非法边。易知原病毒的倒数第二个字母走到最后一个字母为非法边,但是不局限于这样的非法边。因此需要AC自动机的fail指针,如果fail指向的节点有病毒标记,则将这条边也打上病毒标记。然后将边的数量累计一下记录在邻接矩阵里,将这个原创 2015-12-24 22:20:55 · 465 阅读 · 0 评论 -
自动AC机
自动AC机就是trie上的kmp,由于trie从跟到任意节点都是模式串中存在的一个子串,所以可以类比KMP,从每个节点向另一个节点连一条失配边(KMP的失配边就是next数组,因此可视为trie为一条链)。实现的过程中有一点优化,就是如果一个点的某个儿子不存在,把他连向fail指针的该儿子。这样就不用写循环了,清爽了很多。模板题:hdu2222题意:给定一个大字符串和若干模式串,求有多少模原创 2015-12-21 22:42:05 · 1220 阅读 · 0 评论 -
【cf666e Forensic Examination】(后缀自动机+线段树合并)
这个题确实思维方向非常重要!如果用后缀数组做,就转化为区间众数,一脸不可做。(当然莫对+堆还是可以的。。)这个题应该用后缀自动机或者后缀树来做。这样问题就是子树众数,就可以用线段树合并一个log搞定。(为什么我一个log比别人一个log+一个根号还慢啊)#include#include#include#include#include#define rep(i,a,b) for原创 2016-07-06 16:39:48 · 1164 阅读 · 0 评论