字符串
文章平均质量分 68
qingdaobaibai
这个作者很懒,什么都没留下…
展开
-
【bzoj1819】[JSOI]Word Query电子字典 trie+暴力
先建出trie树,暴力在trie树上dfs,三种情况分别对应字符串跳一下,trie树上跳一次,trie树上往不同方向跳一次,注意记录一下每个节点是否出现过,因为可能有同一个字符串经过不同的操作多次到达的情况。#include#include#include#include#include#include#define maxn 200010using namespace原创 2015-11-25 19:03:45 · 1425 阅读 · 0 评论 -
【bzoj4260】 Codechef REBXOR trie树
最近才学会用trie树找异或最大,我是不是太弱了? 关注这道题是因为我的原创题莫名其妙的和太神翻译的这道题撞了,结果被太神好一个嘲讽。 当时出题的时候正好比完初赛,所以就想起了前缀最大和后缀最大的做法,所以就出了这么一个题。 做法就是每次从左往右扫,处理出lmax[i]表示以i为结尾的最大的异或和,右边同理,然后就可以直接搞了。#i原创 2015-10-19 13:38:15 · 1700 阅读 · 2 评论 -
【bzoj3620】 似乎在梦中见过的样子 KMP
一开始看到数据范围是15000就往后缀数组上想,想了好久没想出来怎么处理同一子串的问题,后来看了看题解才发现O(n^2)就可以过,用KMP类似NOI2014动物园的算法一样。枚举左端点,对于每个右端点处理出以右端点为结尾最大长度使得从左端点开始的前缀等于以右端点结束的后缀,即next数组。然后一直往前跳,直到长度小于子串长度的一半为止。#include#include#includ原创 2015-08-04 09:59:49 · 2919 阅读 · 1 评论 -
【bzoj3916】 Baltic2014 friends hash
非常裸的hash,不过是第一次写hash,比较手生,看到WA了以后,果断改成双关键字,最后才发现原来是possible拼错了。。。#include#include#include#include#include#include#define maxn 2001000#define base1 23333#define base2 233using namespace原创 2015-08-04 08:41:23 · 606 阅读 · 0 评论 -
【bzoj2084】 POI2010 Antisymmetry manacher
挺水的一道题,manacher匹配的时候改一下匹配条件就可以了,只要两个数相加等于一时就可以,结果WA了三次,一定要注意是不存在奇数串的,而且统计的时候要用long long,还有一次是忘了除以二。。。还是太弱了#include#include#include#include#include#include#define maxn 1000010using name原创 2015-07-21 20:05:57 · 1380 阅读 · 0 评论 -
【bzoj3790】 神奇项链 mancher+树状数组优化dp
这道题首先用manacher求出回文子串长度,之后问题就转化为已知一堆线段,要用最少的线段,覆盖整个区间,很明显可以用dp来做,f[i]表示1到i这个区间最少用多少线段覆盖,f[i]=min{f[j]} (r[j]http://hzwer.com/5488.html#include#include#include#include#include#include#defi原创 2015-07-21 15:02:19 · 814 阅读 · 0 评论 -
【bzoj2342】 SHOI2011 双倍回文 manacher+set
学习了一下manacher,这个算法是用来求字符串中以每一项为对称轴的最长回文子串长度的。放一下链接:http://blog.csdn.net/ggggiqnypgjg/article/details/6645824/大概用的一个思想就是利用对称,考虑当前覆盖到的最右端(假设为id+p[id]),那么我们可以利用对称性,前面的子串是已经求过的,i的回文子串长度就至少为i关于id对称点的最长原创 2015-07-21 10:48:37 · 1120 阅读 · 0 评论 -
【bzoj3238】[Ahoi2013]差异 后缀数组+单调栈
首先求出height数组,原式很明显可以化成一堆长度的和-两两LCP的和,所以我们考虑每个height能充当多少个区间的最小值即可,那么这个问题可以用单调栈解决,从左和从右各维护一个单调递增的单调栈,求出点i向左和向右分别最多能延伸多长。注意:1.height数组的[i,i]是要计入区间数的,因为我们查询lcp(i,j)的时候查询的是height数组中rank[i]+1~rank[j]的最原创 2015-12-06 19:01:52 · 597 阅读 · 0 评论 -
【bzoj4567】[Scoi2016]背单词 贪心+trie树
我个傻逼,这么水的题还调了那么久。把所有的串都反过来,建trie树,很明显,不同子树间是不影响的。一定是先选择父亲节点再选子节点,同一个节点先选子树大小最小的儿子即可。一开始想错了,以为可以直接再trie树上贪心,后来发现必须要建出新树,因为有的节点公用同一个祖先,但是祖先并不是单词节点,这就很尴尬了。#include#include#include#include原创 2016-05-19 20:40:21 · 826 阅读 · 0 评论 -
【bzoj4516】[Sdoi2016]生成魔咒 后缀自动机
入坑,持续更新SAM系列题目……感觉后缀自动机的构建好难理解,背过代码就可以吧应用好像不难,这道题只需要在所有修改fa的操作时更新ans即可每个节点对应若干个子串,所有节点代表的所有子串本质不同,节点i代表的子串个数为mx[i]-mx[fa[i]]#include#include#include#include#include#include#include#原创 2016-06-29 15:39:32 · 1421 阅读 · 0 评论 -
【bzoj3998】[TJOI2015]弦论 后缀自动机
非常好的一道裸题T=1每个节点的出现次数=它的right集合大小初始时,每加入一个节点,它对应的right集合大小就为1T=0每个节点算一次,即把right集合大小强制变为1对深度计数排序后,节点i对fa[i]产生贡献计算出size[i]表示包含节点i在内,所有的能转移到的子串的出现次数之和注意:不能按bfs序处理size,因为计算size时,还原创 2016-06-29 17:57:10 · 623 阅读 · 0 评论 -
【bzoj3676】[Apio2014]回文串 后缀自动机+倍增+manacher
每找到一个回文串,就在所有的串中查找出现了多少次因为暴力跳非常的慢,所以用倍增优化f[i][j]表示从第i个节点向上跳2^j步到哪里每次查询都是从末尾节点开始,倍增找到最后一个长度大于等于p的节点manacher算法证明了本质不同的回文串只有O(n)个,复杂度O(nlogn)原来manacher可以直接求偶数长度的回文串呀#include#includ原创 2016-06-29 20:52:41 · 1339 阅读 · 0 评论 -
【bzoj3926】[Zjoi2015]诸神眷顾的幻想乡 后缀自动机
注意到叶子节点只有20个,从每个叶子节点开始dfs,在得到的trie树上建后缀自动机比较神奇的是,我们不用考虑那么多奇怪的问题,每个节点只需要从它trie树上的父亲节点开始建后缀自动机,就是对的讲道理,我连增量法都没理解透,更何况树上的呢,反正直接建就对了#include#include#include#include#include#include#define原创 2016-06-29 21:37:36 · 815 阅读 · 0 评论 -
【bzoj3796】Mushroom追妹纸 hash+二分答案
嗯,好久没写hash了。先处理出s3在s1和s2的位置,然后二分答案,看有没有s1和s2有没有公共子串不包含就可以了。#include#include#include#include#include#include#include#define maxn 50010#define mod 10007using namespace std;vector v[m原创 2015-11-17 18:57:52 · 759 阅读 · 0 评论 -
【bzoj3207】花神的嘲讽计划Ⅰ hash
直接hash就好了,每次查询hash表里有没有在这个区间里的就可以,貌似并不用主席树。#include#include#include#include#include#include#include#define maxn 200010#define mod 1000007using namespace std;int hash1[maxn];unsigned原创 2015-11-18 18:12:33 · 1058 阅读 · 0 评论 -
【bzoj3942】 [Usaco2015 Feb]Censoring KMP
比较水,先求一遍T的pre数组,然后在S里暴力匹配就可以了。#include#include#include#include#include#include#define maxn 1000100using namespace std;char s1[maxn],s2[maxn],s[maxn];int next[maxn],pre[maxn];int n,m,原创 2015-11-23 19:54:52 · 902 阅读 · 0 评论 -
【bzoj3160】万径人踪灭 FFT+manacher
首先把字符串用#间隔开总数-连续的字符串连续的用manacher求总数如何求?f[i]表示以i为中心有多少对对称的字符(不包含#,但包含本身)ans=∑2^f[i]-n原字符串的位置i对应新字符串的位置2*if[i]=∑str[j]*str[i-j]第一次a=1,b=0第二次a=0,b=1这样算出来是对称的个数,(f[i]+1)/2是对数最后直接计算原创 2016-03-24 20:03:07 · 429 阅读 · 0 评论 -
【bzoj2085】[Poi2010]Hamsters hash+倍增
dis[i][j][k]表示从第i个串的结尾到第j个串的结尾走过2^k个串的最小长度dis[i][j][0]=len[j]-cal(i,j)cal(i,j)表示如果i的最长后缀等于j的最长前缀倍增floyd好了。#include#include#include#include#include#include#define inf 1000000000000000原创 2016-03-03 07:41:57 · 550 阅读 · 0 评论 -
【bzoj3940】[Usaco2015 Feb]Censoring AC自动机
同3942,把KMP换成AC自动机。开一个栈,记录一下每个位置匹配到哪个节点,如果是单词节点,那么弹出对应长度的字符串。#include#include#include#include#include#include#define maxn 110010 using namespace std; int ch[maxn][26],fail[maxn],q[ma原创 2016-01-18 15:11:23 · 998 阅读 · 0 评论 -
【bzoj4278】 [ONTAK2015]Tasowanie 后缀数组
怎么开始刷水了?并起来,加个大数,求个后缀数组比较排名就可以了。为什么这个题行末还要有空格呀?明明样例没有的。#include#include#include#include#include#include#define maxn 400010 using namespace std;int a[maxn];int wa[maxn],wb[maxn],wc原创 2016-01-03 21:09:09 · 802 阅读 · 0 评论 -
【bzoj1398】Vijos1382寻找主人 Necklace 最小表示法
这道题只需要把原串复制一遍,然后拿另一个串去匹配就可以了。但是作死学了下最小表示法。http://wenku.baidu.com/link?url=disErIxplfqlFvdZy2Zy3q7FO0hYvLBqy0rFbLe93vJfNSJM5BIh4Mh3eWq0a2NPJo-09kbvFPMgyVJ07BPyNQGiw8QPCWrtPYi-RyrULDK最小表示法是判断两个字符串原创 2016-01-03 20:26:01 · 580 阅读 · 0 评论 -
【bzoj1862】[Zjoi2006]GameZ游戏排名系统 splay+trie
发现自己的博客里没有写过平衡树的文章,正好最近复习平衡树就来更新一下吧。题目大意:1、插入一位玩家或者更新一位玩家的成绩2、询问某位玩家的排名3、询问某一排名后的10位玩家的名字若两名玩家成绩相同,则先输入的排名高。玩家通过姓名给出,姓名不超过10个字符。这题有bug,题目上说成绩不超过8位,实际出现了10位数。按照成绩建平衡树。对所有名字建一棵trie原创 2015-12-29 13:07:39 · 641 阅读 · 0 评论 -
字符串专题小结
字符串专题算是搞得差不多了,来大概总结一下吧。要掌握的算法:1、KMP算法作用是两个串之间的匹配,核心思想是pre[i]表示串B的最长的前缀与以i为结尾的后缀相同,每次匹配失败时,从i跳到pre[i]就可以了。2、trie树作用是存储许多个串,核心思想是除根节点每个点表示一个字母,从根节点到每个点的路径表示一个字符串,单词节点打上标记3、AC自动机作用是原创 2015-12-20 21:43:57 · 1987 阅读 · 2 评论 -
【bzoj3012】[Usaco2012 Dec]First! trie+拓扑排序
一开始没有想到暴力就可以,trie的题目复杂度都非常搞笑呀,考虑每一个串如果有一个串是它的前缀,则肯定不行,否则每次从这个字母,向同一个父亲的其他字母连边,如果最后出现环,就是出现矛盾,于是拓扑排序判环就可以了。#include#include#include#include#include#include#define maxn 300010 using namesp原创 2015-11-26 15:00:02 · 740 阅读 · 0 评论 -
【bzoj3689】异或之 trie+堆
好多种解法,自己YY了一种二分答案+trie的做法,不过貌似还是O(nlog^2n)的,看了一下PoPoQQQ大神的题解,发现可以用堆来做,先把每个位置的最小值放入堆里,每次弹出一个元素,假设这个元素是对应位置的第k小,那么把对应位置的第k+1小放入堆中。一个巧妙的处理,因为会重复,所以取2*k次,只取奇数次的就可以了。一开始要考虑自己的问题,所以每个位置的第二小值放入堆中。#原创 2015-11-25 21:23:44 · 958 阅读 · 0 评论 -
【bzoj3439】Kpm的MC密码 trie树+主席树
裸题,倒着建trie树,所有符合要求的串都在它的子树里,然后就是查询子树第k小了,用dfs序+主席树就可以了。#include#include#include#include#include#include#define maxn 300010using namespace std;int lch[maxn*20],rch[maxn*20],root[maxn],c原创 2015-11-25 18:02:41 · 1133 阅读 · 0 评论 -
【bzoj2565】最长双回文串 manacher
刚开始读错题了,以为整个串也要是回文串,后来发现是两个回文串拼起来就好了,那么就先插入‘#’,然后算出l[i]表示以i为结尾的最左的回文串的中心,这个随便算一下就好了,然后枚举每一个‘#’当做断点,然后更新答案。#include#include#include#include#include#include#define maxn 200010using namespa原创 2015-11-24 13:06:11 · 1367 阅读 · 0 评论 -
【bzoj2160】拉拉队排练 manacher
先用manacher求出数组后,用一个差分数组计算每一个长度的字符串出现的次数,暴力计算就好了。#include#include#include#include#include#include#define maxn 1000100#define mod 19930726using namespace std;long long sum[maxn];char s原创 2015-11-23 20:22:18 · 825 阅读 · 0 评论 -
【bzoj4199】[Noi2015]品酒大会 后缀自动机
听说对反串建SAM,fa树就是后缀树?听说两个后缀的LCP就是LCA的mx?然后就是个树上dp?靠,老子边界打错了#include#include#include#include#include#include#define maxn 600010using namespace std;int head[maxn],next[2*maxn],to[2*m原创 2016-06-30 20:44:59 · 1080 阅读 · 0 评论