
算法-String
文章平均质量分 55
YxuanwKeith
这个作者很懒,什么都没留下…
展开
-
GDOI2016模拟3.9 暴走的图灵机 矩阵乘法优化暴力
暴走图灵机 矩阵乘法优化暴力!原创 2016-04-09 22:39:52 · 1232 阅读 · 0 评论 -
JZOJ4617 【NOI2016模拟7.12】可持久化字符串 建Trie后用主席树维护next数组
题目大意现在要求可持久地维护一个字符集大小为MM字符串SS,可以支持对历史版本的询问。现在有NN个操作,对于第ii个操作包含两个整数u,vu,v,表示在第uu个版本的字符串末尾加上字符vv作为第ii个版本的字符串,并且输出每次操作之后的字符串的最短循环节长度。强制在线。N,M≤3∗105N,M \leq 3*10^5解题思路首先要知道的是对于一个字符串SSS,它的最小循环节的长度为最大的tt,使tt原创 2016-09-11 13:01:13 · 1213 阅读 · 0 评论 -
后缀自动机(SAM)学习笔记
构图及原理定义算法后缀自动机(SAM)就是一个要实现能存下一个串中所有子串的算法,按一般来说应当有O(N2)O(N^2)个状态,而SAM却可以用O(N)个状态来表示所有子串,因为它把很多个本质相似的子串映射到了同一个状态上,从而实现了这个优美的算法原创 2016-03-30 20:31:38 · 8610 阅读 · 9 评论 -
51Nod 算法马拉松17 Simple KMP 链剖维护SAM的fail树
题目大意化简一下题意! 现在给你一个长度为NN的字符串,对于每个字符ii,我们要统计AnsiAns_i为前ii个字符有多少个相同的子串,并且其中一个子串一定要经过位置ii。在第ii行输出∑jj=1Ansj\sum_{j = 1}^{j}Ans_j。N≤100000N \leq 100000解题思路我们考虑先对原串建SAM,问题就变成了统计一个前缀所在节点的failfail链上有多少rightrig原创 2016-08-29 11:12:16 · 1132 阅读 · 0 评论 -
JZOJ4708. 【NOIP2016提高A组模拟8.20】奇洛金卡达 倒着做的思想+并查集维护
题目大意给定一个长度小于等于kk的字符串和qq,表示现在有qq个操作,每个操作给定两个参数li,ril_i,r_i表示把现在的字符串第lil_i到rir_i把其中编号为奇数的按顺序写下来,再在后面把编号为偶数的按顺序写下来,最后把写出的新字符串加在区间后面。 一下为两个例子: 1、s1s2s3s4s5s6s7li=3ri=5操作后变成:s1s2s3s4s5s3s5s4s6s71、s_1s_2s_原创 2016-10-18 18:33:44 · 1588 阅读 · 0 评论 -
CodeForces AIM Tech Round 3 (Div. 1) 题解(CF708A,CF708B,CF708C,CF708D,CF708E)
A. Letters Cyclic Shift(CF708A)题解:直接找到第一个不是a的位置i和i后面第一个为a的位置j(如果没有,j=len(s)),那么翻转的肯定就是[i,j]这一段。如果这个字符串都是a,那么就翻转最后一个字符。#include <cstring>#include <cstdio>#include <algorithm>using namespace std;char s原创 2017-02-21 08:50:32 · 1415 阅读 · 1 评论 -
Codeforces Round #397 (Div. 1 + Div. 2 combined) 题解(CF765A,CF765B,CF765C,CF765D,CF765E,CF765F)
A.Neverending competitions(Codeforces 765A)题解:直接判断坐飞机的次数是奇数还是偶数就可以了。#include <cstring>#include <cstdio>#include <algorithm>using namespace std;char h[100];int n;int main() { scanf("%d", &n);原创 2017-02-21 21:00:58 · 1211 阅读 · 0 评论 -
回文树(Palindromic Tree)+黑科技 学习笔记
回文树(Palindromic Tree)最基本的回文树在网上用很多资料,在这里做简单的介绍。本文的重点是后面回文树的一些更广泛的应用。注:本文的图片转自http://adilet.org/blog/25-09-14/,所以图中某些变量的定义可能与本文不同,需要注意。定义节点回文树中的每个节点都对应了一个回文串。特别注意在回文树中还有两个特殊的节点分别对应了空串和长度为−1-1的串,是为了添加只有一原创 2017-03-24 22:48:01 · 3793 阅读 · 4 评论 -
学习笔记 后缀平衡树简要小结(附例题)
定义后缀平衡树,简单的说就是动态的维护后缀数组,能做到在O(logn)O(logn)插入,O(1)O(1)查询rankrank,O(logn)O(logn)查询SASA。当然由于后缀平衡树是支持对后缀的操作,所以要求插入操作只能在字符串开头插入字符(相当于插入一个后缀)。离线构造根据定义,后缀平衡树就是把后缀数组构成一棵平衡树,所以只需先构出后缀数组再构后缀平衡树。在线构造由于后缀平衡树只能支持在开原创 2016-10-05 22:50:05 · 3542 阅读 · 0 评论 -
JZOJ4774 【GDOI2017模拟9.10】子串 线段树合并维护SAM的fail树信息(CF 666E类似)
题目大意有NN个字符串,S1,S2...SNS_1,S_2...S_N。现有有QQ个形如(li,ri,Pi)(l_i,r_i,P_i)的询问,表示字符串PiP_i在SlS_l~SrS_r中多少个串出现过。N,Q≤5∗105N ,Q\leq 5*10^5解题思路看到这种多串匹配为问题,我们可以考虑用SAMSAM来实现。首先,我们对NN个串SiS_i建一颗TrieTrie,在TrieTrie上构SAMS原创 2016-09-10 17:26:37 · 1534 阅读 · 0 评论 -
CF 616F Expensive Strings 用到fail链性质的SAM练手题
题目大意给定NN个串tit_i,每个串有一个权值cic_i。现在要求找到一个串SS,满足∑Ni=1ci⋅|S|⋅pi,s\sum^{N}_{i=1}c_i\cdot|S|\cdot p_{i,s},pi,sp_{i,s}表示SS在tit_i中出现次数。N≤105N \leq 10^5 ci ≤107c_i\ \leq 10^7 ∑ti≤5∗105\sum t_i \leq 5 * 10^5解题思原创 2016-08-16 23:12:45 · 1219 阅读 · 0 评论 -
GDOI2016模拟4.22 无界单词 字符串上的动态规划
题目大意给定一个NN和KK,问所有长度为LL的仅包含字符a,ba,b的单词中有多少个无界单词,以及字典序第KK的无界单词是什么? 有界单词:对于一个单词SS,如果存在一个长度LL,满足0<L<length(S)0 < L < length(S),并且使得SS长度为LL的前缀与S长度为LL的后缀相同,则称SS是有界的。 无界单词:对于一个单词SS,如果不存在一个LL使之成为有界单词,即它为无界单词原创 2016-04-22 20:56:27 · 1459 阅读 · 2 评论 -
波兰表 不会被卡但多了个Log的Hash
转自 http://vfleaking.blog.163.com/blog/static/174807634201321981915529/后来发现其实就是把倍增算法构造后缀数组的标号存下来。在POI 2010 官方题解 P77面看到了这个东西。由于不知道这个数据结构叫什么名字,波兰人原话是“这个数据结构”……有点"You-Know-Who"的感觉。貌似是转载 2016-07-30 16:08:56 · 1168 阅读 · 0 评论 -
NOI2015模拟SXK 字符串游戏 后缀数组预处理+主席树查询
NOI2015模拟SXK 字符串游戏 后缀数组预处理 + 主席树查询原创 2016-04-13 20:20:45 · 2367 阅读 · 0 评论 -
SHTSC2011(SHOI) 双倍回文 一道用Manacher优化的动态维护题
SHTSC2011(SHOI) 双倍回文 一道用Manacher优化的动态维护题原创 2016-04-11 20:54:32 · 1192 阅读 · 0 评论 -
GDKOI 2014 基因模式 基于SAM的算法
GDKOI 2014 基因 基于SAM的算法原创 2016-04-01 12:49:00 · 2175 阅读 · 0 评论 -
CF 700E Cool Slogans 线段树+后缀数组贪心求解
题目大意化简成我理解的题意,跟原题有点不一样! 给你一个长度为NN的字符串SS,定义一个字符串AA比另一些字符串BiB_i”酷”,当且仅当AA中有至少两个为BiB_i的子串(可以重叠,但不可以完全重叠),并且A串的价值为BiB_i中价值的最大值加1(每个串的初始价值为11)。问SS价值最大的子串价值多少。N <= 2∗1052 * 10 ^ 5解题思路由于现在有求价值最大的子串,所以我们可以用贪心原创 2016-07-31 22:38:06 · 1928 阅读 · 0 评论 -
CF 316G3 Good Substring SAM上的简单计数
题目大意给你一个长度为NN的字符串SS和MM个限制。每个限制为(t,l,r)(t,l,r),表示限制字符串ss在tt中的出现次数为ll到rr。问SS中有多少不同的子串符合这MM条限制。N,Lenti≤500000N , Len_{t_i}\leq 500000 M≤10M \leq 10解题思路看到这题,一个很直接的思路就是用SAM来做,我们可以先建出SS的SAM,然后再把MM个限制串也放进去。S原创 2016-08-16 16:40:55 · 868 阅读 · 0 评论 -
CF 319D Have You Ever Heard About The World? 二分Hash判断可行解
题目大意给你一个字符串SS,要求你每次找到一个最短的形如XXXX(即由两个相同的字符串拼接而成)的子串,如有多个找最左边的那一个。然后把这个字符串从XXXX变成XX,问无法操作后的字符串是什么?|S|≤50000|S| \leq 50000解题思路要解决这题,有两个关键的性质是一定要发现的。 1. 每次找到的符合要求的子串的程度是不减的。 2. 在删除相同长度的子串时一定是从左到有又删除的。原创 2016-04-13 16:31:11 · 1303 阅读 · 0 评论 -
五分钟搞懂后缀数组!后缀数组解析以及应用(附详解代码)
这是一篇本人自己对后缀数组的一些理解,有详细的说明以及附有详解的代码。原创 2016-02-05 13:13:36 · 46026 阅读 · 85 评论