Loading

随笔分类 -  字符串

1
摘要:[国家集训队]最长双回文串 题意 求长度$n$的串$S$的最长双回文串$T$ 即$T$能分为两部分$X,Y$ (\(|X| \geq 1,|Y| \geq 1)\) 且$X,Y$都为回文串 分析 可以用回文自动机维护每个位置的最长回文后缀$R[i]$ 那么答案就是$max(R[i] + L[i + 阅读全文
posted @ 2021-07-13 17:26 MQFLLY 阅读(64) 评论(0) 推荐(0)
摘要:APIO2014 回文串 回文自动机 题意 定义$s$的一个子串的存在值为这个子串出现的次数乘子串的长度 求$s$的所有回文串的存在值 \[ 1 \leq |s| \leq 300000 \] 分析 对$s$构建出回文自动机,$cnt$表示当前结点当前的出现次数,那么类似AC自动机的fail树,倒序 阅读全文
posted @ 2021-07-13 17:22 MQFLLY 阅读(50) 评论(0) 推荐(0)
摘要:LOJ-2123 最短不公共子串 后缀自动机,子序列自动机 前几天做了一道GYM的最短非公共子串,利用子序列自动机性质DP来做,后来又发现了此题 HEOI2015 题意 给定小写字母串$A,B$ 计算 1.A的一个最短的子串,它不是B的子串 2.A的一个最短的子串,它不是B的子序列 3.A的一个最短 阅读全文
posted @ 2021-04-12 18:41 MQFLLY 阅读(103) 评论(0) 推荐(0)
摘要:GYM-102361J MUV LUV EXTRA kmp求最小循环节 题意 给定正整数$a,b$求最大的$a \times p - b\times l$,其中$p$表示后缀的循环节的总长度,$l$表示这个最小循环节的长度 \[ 1 \leq a,b\leq 1e9\\ 1 \leq |s| \le 阅读全文
posted @ 2021-03-17 21:53 MQFLLY 阅读(95) 评论(0) 推荐(0)
摘要:P4551 最长异或路径 Trie经典应用 bitset应用 bitset使用 一个长度为$N$的bitset下标编号为$[0,N)$ 进行单点修改时,可以直接访问位置并且赋值 \[ s[pos] = x; \] bitset重载了<< 和 >> 输入输出流,可以使用cin或者cout输入输出一个b 阅读全文
posted @ 2021-03-15 22:05 MQFLLY 阅读(116) 评论(0) 推荐(0)
摘要:GYM-101194F Mr. Panda and Fantastic Beasts 后缀数组套路 题意 给定$n$个字符串,找出第一个字符串的最短的子串,使得其不存在任何其他字符串中 \[ 1 \leq T \leq42\\ 2 \leq N \leq 50000\\ N \leq \sum|S_ 阅读全文
posted @ 2021-03-03 21:27 MQFLLY 阅读(82) 评论(0) 推荐(0)
摘要:SPOJ-SUBST1 New Distinct Substrings 后缀数组 题意 给定一个字符串,求其中本质不同的子串 \[ T \leq 20 \\ |s| \leq 50000 \] 分析 直接找不同的有点麻烦,不妨反着考虑本质相同的子串的个数 height数组的含义是$sa[i]$和$s 阅读全文
posted @ 2020-11-30 18:22 MQFLLY 阅读(111) 评论(0) 推荐(0)
摘要:UVA11107 Life Forms 后缀数组 求最长出现次数超过一半的子串 题意 输入$n$个DNA序列,你的任务是求出一个长度最大的字符串,使得它在超过一半的DNA序列中连续出现。如果有多解,按照字典序从小到大输出 \[ n \leq 100\\ |s| \leq 1000 \] 分析 首先用 阅读全文
posted @ 2020-11-29 21:16 MQFLLY 阅读(149) 评论(0) 推荐(0)
摘要:POJ-1743 Musical Theme 后缀数组求不可重叠最长重复子串 题意 给出一段乐曲,计算其中最长“主题”的长度 主题需要满足 长度至少为5个字符 在乐曲中重复出现(可能经过转调) 重复出现的同一主题不能有公共部分 所谓“转调”,是指每个音符都被加上或者减去同个值。 乐曲中的每个音符都是 阅读全文
posted @ 2020-11-29 21:08 MQFLLY 阅读(145) 评论(0) 推荐(0)
摘要:[模板] 后缀数组 int rak[maxn],height[maxn]; void cal_height(vector<int> p,string s){ int n = s.length(); int k = 0; for(int i = 0;i < n;i++) rak[p[i]] = i; 阅读全文
posted @ 2020-11-25 19:39 MQFLLY 阅读(133) 评论(0) 推荐(0)
摘要:Gym - 102470J Stamming Aliens 字符串哈希 题意 给出一个字符串,寻找最长的子串,使得这个子串的出现次数不少于$m$ 次,且输出这个子串最后一次出现的位置。若有多个子串符合条件,则找出最右边的子串。 若没有,输出"none" \[ m \leq |s| \leq 4000 阅读全文
posted @ 2020-08-22 19:00 MQFLLY 阅读(243) 评论(0) 推荐(0)
摘要:给定字符串,输出所有相等的前后缀的长度。 首先容易想到Next[len2] 必然满足题目要求。 接下来的所有也满足的必然是s2[1 ~ Next[len2]]的前后缀,即是一个递归的过程。 char s1[1005], s2[400005]; int Next[400005]; int len1, 阅读全文
posted @ 2020-08-07 10:41 MQFLLY 阅读(88) 评论(0) 推荐(0)
摘要:题意:给定一个字符串,问最少需要添加几个字符可以使之变为循环序列。 考虑到字符串的最小循环节。 对于len2这个点,若len2 % (len2 - Next[len2]) == 0 则存在最小循环节,长度即len2 - Next[len2]。循环次数 len2 / (len2 - Next[len2 阅读全文
posted @ 2020-08-07 10:24 MQFLLY 阅读(99) 评论(0) 推荐(0)
摘要:给定一个字符串,求字符串的每个循环串的长度和循环节的大小 注意初始化Next 若 i 是 i - Next[i] 的倍数,表面这一段是循环串,循环节的长度是i - Next[i]。这是由于Next数组表示最长公共前后缀,若是倍数关系,表面前面的一段恰好是重复的。 char s2[maxn]; int 阅读全文
posted @ 2020-07-29 14:22 MQFLLY 阅读(156) 评论(0) 推荐(0)
摘要:序列自动机是用于处理子序列问题的一种工具。其实现类似KMP,大致操作是建立一个Next数组,用于各自操作。 1. 51Nod 2504 给定一个字符串和若干个word,问有多少个word是该字符串的子序列。 注意建立Next时从1开始。 #pragma warning(disable:4996) # 阅读全文
posted @ 2020-07-22 14:19 MQFLLY 阅读(194) 评论(0) 推荐(0)
摘要:#pragma warning(disable:4996) #include<iostream> #include<algorithm> #include<bitset> #include<tuple> #include<unordered_map> #include<fstream> #inclu 阅读全文
posted @ 2020-07-15 20:13 MQFLLY 阅读(160) 评论(0) 推荐(0)
摘要:给你一个字符串s,共有q次操作,每个都是下面两种形式的一种。 1 i c:这个操作表示将字符串s的第i项变为字符c 2 l r y:这个操作表示输出字符串y在字符串s中以第l项为起点,以第r项为终点的子串(包括第l和第r项)中作为子串出现的次数。 考虑到有修改操作,跑KMP必然是不行的。 因此考虑暴 阅读全文
posted @ 2020-07-15 19:38 MQFLLY 阅读(160) 评论(0) 推荐(0)
摘要:要掌握KMP ,重点掌握两点 1.Next数组的作用 2.Next数组的求法。 #pragma warning(disable:4996) #include<iostream> #include<algorithm> #include<bitset> //#include<unordered_map 阅读全文
posted @ 2020-07-14 09:42 MQFLLY 阅读(199) 评论(0) 推荐(0)
摘要:Tire 是一种用于实现字符串快速检索的多叉树结构。Tire的每个节点都拥有若干个字符指针,若在插入或检索字符串时扫描到一个字符c,就沿着当前节点的c字符指针,走向该指针指向的方向。 基本操作: int trie[SIZE][26], tot = 1; bool End[SIZE]; void in 阅读全文
posted @ 2020-07-13 10:43 MQFLLY 阅读(134) 评论(0) 推荐(0)
摘要:字符串Hash可以把一个长度任意的字符串映射成一个非负整数,并且其冲突概率几乎为0 取一固定值P,把字符串看作P进制数,并分配一个大于0的值,代表每种字符。一般来说,分配的数都远小于P。例如 a = 1, b=2 , z=26 取一个固定值M,求出该P进制对M的余数,作为Hash值。 一般来说,P取 阅读全文
posted @ 2020-07-12 21:04 MQFLLY 阅读(196) 评论(0) 推荐(0)

1