字符串
文章平均质量分 60
扩展的灰
扩展的灰(Extended Ash)
展开
-
PKUSC2018部分题解
.LOJ的std+数据+当时讲题的记忆硬是刚了五道题(D1t3咕咕咕)稍微写一下题解LOJ6432 「PKUSC2018」真实排名一道比较简单的题,不过需要注意很多细节考虑排名不变的两种情况1.自己分数xxx不变,那么所有分数在[[x2],x)[[\frac{x}{2}],x)[[2x],x)中的其他人的分数也不能变,否则必然有在自己后面的人到自己前面2.自己分数xxx翻倍,那么...原创 2018-12-29 11:04:04 · 687 阅读 · 0 评论 -
Jzoj4348 打击目标
又是被水题坑了。。。一直想不出来看题解说要什么主席树,于是开始打离线算法结果打到一半发现要强制在线。。No!!!发现直接AC自动机似乎可做?树剖之后在AC自动机上跑的时候判断一下不就好了吗!连线段树都不要让后快乐切掉,速度还可以(废话,人家N^2暴力都跑得飞快)#pragma GCC opitmize("O3")#pragma G++ opitmize("O3")#in原创 2017-12-30 21:32:38 · 373 阅读 · 0 评论 -
Jzoj2682 最长双回文串
顺序和逆序读起来完全一样的串叫做回文串。比如acbca是回文串,而abc不是(abc的顺序为“abc”,逆序为“cba”,不相同)。 输入长度为n的串S,求S的最长双回文子串T,即可将T分为两部分X,Y,(|X|,|Y|≥1)且X和Y都是回文串。PAM模(mu)板题当然也可以manacher+DP,跑的快#include#include#include#define原创 2017-12-07 22:01:39 · 269 阅读 · 0 评论 -
Poj1743 Musical Theme
题目传送门题意:对一个序列的差分求出现至少两次且两次不相交的最长子串也是SA和SAM都可以做,SA稍微麻烦SA做法:二分+height分段rmqSAM做法(太神了):对于每个节点的right集合,求出其中的最大值和最小值那么合法的长度一定为min(mx[x],r[x]-l[x])(l和r分别是最大值和最小值)#pragma GCC opitmize("O3")#pra原创 2017-11-27 20:41:08 · 251 阅读 · 0 评论 -
Poj2774 Long Long Message
题目传送门题意:求两个字符串的LCS这个题是SA的经典题,也是SAM的经典题SA做法:连接两个字符串(中间加个#)让后求height,Answer=Max{height[i]}SAM做法:从开头匹配字符串,如果当前节点x能继续匹配就继续如果不能匹配,就令x=f[x]直到x为根或者可以继续匹配,这样显然是正确的,因为f[x]显然是x的后缀#include#includ原创 2017-11-27 20:06:56 · 328 阅读 · 0 评论 -
HDU2896 病毒侵袭
题目传送门AC自动机第一题~一看就是一个非常简单的多串匹配问题了,输出方案?记录一下就好了注意这里code是Trie图,它是AC自动机的改进版本,有效利用了原本无用的边,这反而简化了代码#include#include#include#include#define N 100010using namespace std;char s[N];int fail[N],原创 2017-11-27 16:07:53 · 289 阅读 · 0 评论 -
Jzoj3648 【GDOI2014】beyond
当年还是too naive了啊,这么简单的题居然没做出来,太弱啦(讲真我那年还没上初中呢。。。)要是明年遇上这种题目就好了,嘻嘻嘻很显然的,最大的答案一定在两个串中出现过,那么我们来考虑如何找出这个串枚举一个x,我们用二分+hash求出a[x]和b[1]的lcp,设为len,让后再看a[1..x-1]和b[len+1,x+len+1]是否相等就好了因为哈希常数非常小jzoj跑得快,原创 2017-12-05 19:06:58 · 443 阅读 · 0 评论 -
Jzoj3654 【APIO2014】回文串
题意:求出现次数*长度最大的回文串很水的一道题直接用回文树可以切了太菜并不会回文树,用了极慢的sam+manachermanacher求出所有回文子串用sam在parent树上面倍增就可以求出一个串的出现次数,manacher是O(n)的,倍增lgn,整体复杂度nlgn(分开的manacher比什么插入特殊符号的好写多了)#include#include#include原创 2017-10-21 20:24:55 · 440 阅读 · 0 评论 -
Jzoj4061 字符串树
给一个树,每条边上面有一个字符串,每次询问两个节点路径上的字符串中有多少以给定的一个字符串为前缀显然是一个十分简单的题目,当时想多了打了树剖+Trie合并后来才意识到可以用差分+可持久化trie,过于愚蠢了。。。。。其实solution给了另一种解法,将所有字符串排序,哈希求lcp,让后存在一个数组里面,让后就可以用主席树了反正这题比较简单#pragma GCC opitm原创 2017-12-04 20:42:04 · 315 阅读 · 0 评论 -
Jzoj3172 贴瓷砖
A镇的主街是由N个小写字母构成,镇长准备在上面贴瓷砖,瓷砖一共有M种,第i种上面有Li个小写字母,瓷砖不能旋转也不能被分割开来,瓷砖只能贴在跟它身上的字母完全一样的地方,允许瓷砖重叠,并且同一种瓷砖的数量是无穷的。问街道有多少字母(地方)不能被瓷砖覆盖。、今天翻看题库发现这道题忘记写题解了。。。非常好的卡常题,题目也很裸,直接AC自动机+前缀和判定就好了,但是当时不知道为什么用了fen原创 2018-01-11 16:41:10 · 270 阅读 · 0 评论 -
后缀自动机转后缀树模板
终于找到教程了,现在来写一发题目:Jzoj4072(bzoj3998)弦论 第一问其实非常好写,连空间都不需要多开一倍,只需要sa数组rank数组和height数组就好了,dfs一次可以求出#include#include#include#include#define N 1000010using namespace std;char str[N]; long原创 2018-01-12 19:38:00 · 485 阅读 · 2 评论 -
51Nod1469 淋漓尽致子串
首先,我们来定义一下淋漓尽致子串。1.令原串为S。2.设子串的长度为len,在原串S中出现的次数为k,令其出现的位置为p1, p2, ....pk(即这个子串在原串中[pi,pi + len - 1]中出现)。3.若k=1,则该子串不是淋漓尽致子串。4.若存在pi,pj(i != j),使得S[pi - 1] = S[pj - 1],则该子串不是淋漓尽致子串。5.若存在pi原创 2018-02-07 09:27:26 · 268 阅读 · 0 评论 -
Bzoj2434 阿狸的打字机
纪念一次AC,水一篇blog又是喜闻乐见的广义SAM题辣题意:给一个trie,每次问询一个串在另一个串出现的次数思路:建立广义SAM,离线所有询问,每次讲一个主串在fail树上的节点+1,处理询问就用fenwick维护子树和这里注意,1.广义SAM要用bfs建2.每次从一个主串到下一个时,不要整个都减掉而是要在LCA处会和,这样复杂度就是对的代码有点长但是很好打#include&...原创 2018-11-26 21:12:32 · 261 阅读 · 0 评论 -
字符串专题1
.都是些bzoj原题辣,这几天刚做的 Bzoj4032有趣的dp题,也要用到各种自动机注意到题目的两个关键词“子串”和“子序列”考虑对A和B串建立后缀自动机和序列自动机序列自动机:可以识别一个序列所有子序列的自动机 想必学过自动机的各位都知道这个玩意怎么建,这里不再阐述让后我们考虑这些询问询问1:直接用SAM做类似LCS的做法求出A每个前缀和B匹配的最长距离,取最小+1询问2:...原创 2018-11-19 22:06:20 · 259 阅读 · 0 评论 -
后缀数组SA-IS模板
.SAIS真的好快啊,在UOJ能卡进第二页推荐几个讲的比较好的博客链接1链接2链接3和一篇讲了各种后缀数组算法的论文Code:#pragma GCC optimize("O3")#pragma G++ optimize("O3")#include<stdio.h>#include<string.h>#include<algorithm>...原创 2018-11-14 10:43:44 · 1039 阅读 · 0 评论 -
Jzoj5665 奥立卡的诗
终于又遇到SAM的题了好好玩,而且就这道题让我弄清楚了广义SAM和Trie上SAM的区别其实两者是没有多少区别的,不过Trie上SAM可以更快关于Trie上SAM,是用bfs的方法来构建的,相比起广义SAM用dfs建少了一个深度之和的部分但是如果原题给的就是Trie那么就只能用bfs了,因为dfs会被卡成O(n^2) (考虑一个扫把)回到本题,简化一下式子发现这道题求的是不同子串的原创 2018-04-20 21:18:25 · 262 阅读 · 0 评论 -
Jzoj3351 神牛养成计划2
前文再续,书接上回,话说神牛yxr成功培育出神牛细胞,可最终培育出来的生物体却让他大失所望……后来,他从某GD女神 牛处知道,原来他培育的细胞发生了基因突变,原先决定神牛特征的基因序列都被破坏了,神牛yxr很生气,但他知道基因突变有低频性,说不定还有一些优秀基因没有突变,那么他就可以用限制性核酸内切酶把它们切出来,然后再构建基因表达载体什么的,后面的你懂的。神牛yxr现在知道了N个细胞的D原创 2018-04-20 20:40:03 · 241 阅读 · 0 评论 -
Jzoj5603 xiz
给定字符串 S 和 T。串A和串B匹配的定义改为:存在一个字符的映射,使得A应用这个映射之后等于B,且这个映射必须为一个排列。A=121, B=313,当映射为{1->3, 2->1, 3->2}时A'=B,可以匹配A=212, B=313,当映射为{1->1, 2->3, 3->2}时A'=B,可以匹配A=232, B=313,当映射为{1->2, 2->3, 3->1}时A'=原创 2018-04-17 21:50:27 · 294 阅读 · 0 评论 -
51Nod1553 周期串查询
题目看这里我们发现需要动态维护一个字符串是否成周期根据border的一个简单性质,得出周期串的充分必要条件是,如果a[i..k]=a[j-k+1..j] 那么a[i..j]是以k为周期的串于是可以用线段树来维护哈希莫名其妙rank1..#include#include#include#define N 100010#define LL long long #def原创 2018-03-22 22:05:51 · 312 阅读 · 0 评论 -
51Nod1395 两个回文
题目看这里复习一下PAM做两次回文自动机,一次正串,用f[i]表示以i结尾的串最长的回文子串反过来做一次记为g[i]那么ans=max(f[i]+g[n-i])#include<stdio.h>#include<string.h>#include<algorithm>#define N 100010using namespace std;char S[...原创 2018-02-27 22:06:51 · 284 阅读 · 0 评论 -
Jzoj3756 【NOI2014】动物园
下课前,园长提出了一个问题:“KMP 算法只能求出 next 数组。我现在希望求出一个更强大 num 数组——对于字符串 S 的前 i 个字符构成的子串,既是它的后缀同时又是它的前缀,并且该后缀与该前缀不重叠,将这种字符串的数量记作num[i]。例如 S 为 aaaaa,则 num[4] = 2。这是因为 S 的前 4 个字符为 aaaa,其中a 和 aa 都满足性质‘既是后缀又是前缀’,同时保证原创 2017-12-04 20:35:14 · 418 阅读 · 0 评论 -
字符串专题讲解
最近教练叫我去讲字符串专题,于是来写一写这方面的内容主要就讲以下几个吧:1.Kmp 2.Extended Kmp3.Trie4.AC Automation5.String Hash6.Suffix Array7.Suffix Automation8.Suffix Tree9.manacher10.Palindrome Automation11.Suf原创 2017-11-26 16:03:44 · 992 阅读 · 10 评论 -
Bzoj3998 弦论
物理题目传送门求第k大的子串?SAM模板题啊CLJ的论文都讲了怎么做啊,把自动机看成一个后缀Trie求出size让后像多叉平衡树那样乱搞就好了~比前两个哈希的题好多了~ (顺便,hdu高亮好好看啊)#pragma GCC opitmize("O3")#pragma G++ opitmize("O3")#include#include#include#define N原创 2017-12-01 20:48:26 · 254 阅读 · 0 评论 -
Jzoj4734 恶魔
其实就是在求有几对完全相等子串满足长度小于等于k而已很明显打一个sam就好了,条件就是mx[f[p]]#include#include#include#define N 200010 using namespace std;char str[N]; long long A=0;int s[N][26],mx[N],f[N],sz[N];int n,k,cnt=1,lst=原创 2017-10-21 22:00:17 · 287 阅读 · 0 评论 -
Jzoj4439 不是回文串
我倒是觉得上面那一问难一点呢。。。。下面一个SAM就没掉了,上面还要加上倍增和马拉车size为right集合大小,mx为最大长度,跑出parent树,OK搞定#include#include#include#define N 2000010using namespace std;char str[N]; long long A=0;int s[N][26],sz[N],原创 2017-10-06 20:41:26 · 301 阅读 · 2 评论 -
Jzoj4614 字符串(待填)
(EMPTY)原创 2017-10-07 22:32:40 · 329 阅读 · 0 评论 -
Jzoj3443 压缩
看到数据范围我们发现可以用dp,设f[i][j]表示目前在第i位,最后一个循环串的长度为j的情况下,最短的长度那么显然,无论怎么样,有一种转移总是成立的,f[i][j]=min(f[i-j][k]+j+1),这相当于新开了一个循环节而另一个转移需要满足一个条件,f[i][j]=min(f[i-j][j]+1),当s(i-j+1,i)=s(i-j*2+1,i-j)时,这相当于在循环节里面加入一个*那么综合下来转移就是n^3的,我们加上两个优化1.令g[i]为min(f[i][k]),避免每次枚举k2原创 2017-09-25 19:39:21 · 275 阅读 · 0 评论 -
Jzoj2937 监听还原
Alice和Bob正在悄悄地给对方发信息,信息都是由英文小写字母组成的,他们约定,所有的字母都得经过一个字母表进行变换,以防泄漏。另一方面John却在监听。John发现,Alice和Bob通信的时候,总是先发送加密后的密文,然后紧接着发送原文。但是Alice和Bob似乎也意识到了似乎有人监听,有时候会随意中断了他们的通信。不过每次都是在发送完密文之后才停止传送的。也就是说,John原创 2017-09-21 16:16:14 · 449 阅读 · 0 评论 -
Jzoj2921【NOI2012模拟题】字符串识别
神(shui)题,AC后看了下别人的code发现全都是后缀数组(难看)可能是因为我太弱了所以只想到SAM的算法做法:建立SAM,求出parent树,预处理倍增,让后就可以O(lg n)查询一个字串的出现次数了接下来,我们对于每个l∈[1,n],我们求出一个最小的r使得[l,r]在整个串里面只出现一次那么对于每个点i,ans[i]有两种情况:1.i被一个最短的区间[lj,原创 2017-09-20 20:54:46 · 400 阅读 · 0 评论 -
Jzoj1309 最长二重串
给你一个字符串,要你求出最长的至少出现两次的子串这个题呢,很明显是SA啦 是SAM的裸题!帅气简介高大上的SAM出现啦(比难看的SA好到不知道哪里去了)#include#include#include#define N 400010using namespace std;char str[N];int s[N][26],mx[N],f[N],sz[N];原创 2017-09-19 21:55:55 · 539 阅读 · 0 评论 -
Jzoj1155 有根树的同构(树的Rabin-Karp)
这里简单说一下rabin-karp其实就是字符串hash算法,不理解的可以自行百度对于一颗树,我们可以将其变为一个括号序列,对这个括号序列作rabin-karp,让后就可以轻松判断同构了是不是很简单细节不多说,有一点必须注意:因为子树是无序的,所以dfs时必须对子树排序#include#include#include#includeusing namespace std;原创 2017-09-19 19:51:46 · 571 阅读 · 0 评论 -
Jzoj5462【NOIP2017提高A组冲刺11.8】好文章
nodgd写了一篇文章,自认为这是一篇好文章。nodgd的文章由原创 2017-11-08 15:39:47 · 711 阅读 · 0 评论 -
Jzoj4876 基因突变(红警系列)
邪恶的707刚刚从白垩纪穿越回来,心中产生了一个念头:我要统治人类! 但是统治人类是很庞大且复杂的一个工程,707尝试了洗脑,催眠,以及武装镇压都没能成功地统治人类,于是她决定从科学上对人类的基因进行研究从而达到他的目的。 707获取了人类的基因信息并尝试对基因进行实验。他发现可以把人类的基因看做一个只包含小写字母的字符串,并定义从头开始任意长度的基因为“源头基因”人类身上与源原创 2017-10-31 08:10:28 · 1330 阅读 · 0 评论 -
一些基础算法的模板(持续更新)
更新中//Templates From Extended_Ash/Cooevjnz/JacaJava/Tubbcrafft//To be continued...//Suffix Automationchar str[N]; int s[N][26],mx[N],f[N],sz[N]; int last=1,cnt=1,n,v[N],r[N],ans=0; inlin原创 2017-10-25 22:05:58 · 3734 阅读 · 0 评论 -
Bzoj1014 外星人Prefix
题目传送门和上一篇题目几乎一样,不过还是这道题良心!bzoj好!poj慢到出*splay大法好! 两次AC不卡常!#pragma GCC opitmize("O3")#pragma G++ opitmize("O3")#include#include#include#define N 400010#define LL long long#define son(x) (原创 2017-12-01 20:38:25 · 236 阅读 · 0 评论 -
Poj2758 Checking the Text
题目传送门经典的数据结构维护字符串哈希这里用了很慢很慢的splay各种T(也可能是死循环)不过没办法因为会写splay的能力还是要有的#pragma GCC opitmize("O3")#pragma G++ opitmize("O3")#include#include#include#define N 100010#define LL long long#def原创 2017-12-01 19:06:27 · 374 阅读 · 0 评论 -
Jzoj4384 Hashit
你有一个字符串S,最开始为空,要求支持两种操作在S后面加入字符c删除S最后一个字符每次操作询问S有多少个两两不同子串应该本来应该用SAM+Trie离线做的,然而为了练一下后缀平衡树就写了其实也很好写,用哈希比较一下就好了,可以用set实现,开一个数组存每个后缀对应的节点就好求height也可以用哈希#pragma GCC opitmize("O3")#pragma原创 2017-12-10 13:15:51 · 495 阅读 · 0 评论 -
Poj3294 Life Forms
题目传送门哈哈哈广义SAM真的好简(du)单(liu)啊到时候讲课可以拿来祸害众生,Yeah!好了开始讲题解,我们将所有字符串加入广义SAM里面对每一个节点维护一个bitset表示它在哪些主串中出现过,让后标记上传就用或运算就好了因为题目要求输出方案,加上一个dfs就可以了,复杂度O(L*n/64)(其实题目本质就是parent树上每个节点为一个集合,求一个子树的并的大小而原创 2017-11-30 17:34:32 · 416 阅读 · 0 评论 -
Jzoj1950 拉拉队排练
艾利斯顿商学院篮球队要参加一年一度的市篮球比赛了。拉拉队是篮球比赛的一个看点,好的拉拉队往往能帮助球队增加士气,赢得最终的比赛。所以作为拉拉队队长的楚雨荨同学知道,帮助篮球队训练好拉拉队有多么的重要。 拉拉队的选拔工作已经结束,在雨荨和校长的挑选下,n位集优秀的身材、舞技于一体的美女从众多报名的女生中脱颖而出。这些女生将随着篮球队的小伙子们一起,和对手抗衡,为艾利斯顿篮球队加油助威。原创 2017-12-08 17:09:45 · 382 阅读 · 0 评论 -
Jzoj5454【NOIP2017提高A组冲刺11.5】仔细的检查
nodgd家里种了一棵树,有一天nodgd比较无聊,就把这棵树画在了一张纸上。另一天nodgd更无聊,就又画了一张。这时nodgd发现,两次画的顺序是不一样的,这就导致了原本的某一个节点u0在第一幅图中编号为u1,在第二副图中编号为u2。于是,nodgd决定检查一下他画出的两棵树到底是不是一样的。nodgd已经给每棵树的节点都从1到u进行了编号,即每棵树有n个节点。如果存在一个1到原创 2017-11-06 07:38:26 · 332 阅读 · 0 评论