随笔分类 -  字符串题题解

摘要:题目链接 题意:给你一个由小写拉丁字母组成的字符串 s。 我们定义s的一个子串的存在值为这个子串在s中出现的次数乘以这个子串的长度。 对于给你的这个字符串s,求所有回文子串中的最大存在值。 思路:建出回文树,使用类似后缀自动机统计出现次数的方法。 由于回文树的构造过程中,节点本身就是按照拓扑序插入, 阅读全文
posted @ 2020-10-14 20:24 Ldler 阅读(85) 评论(0) 推荐(0)
摘要:题意:多个串的最大公共子串 思路:用广义后缀数组构造后,记录每个点包含的节点,最后判断那个点包含所有点。 #include <bits/stdc++.h> using namespace std; #define MAXN 2000000 // 双倍字符串长度 #define CHAR_NUM 30 阅读全文
posted @ 2020-10-14 10:50 Ldler 阅读(72) 评论(0) 推荐(0)
摘要:题目链接 题意: 求一个字符串每个前缀的最小后缀的下标。 思路: 可以使用Lyndon分解来做。因为一个字符串进行Lyndon分解后,最小的后缀一定是最后一个Lyndon串。 在运行Duval算法求Lyndon分解的过程中,每次在最后加入一个字符,我们就可以求出以该字符结尾的前缀的最小后缀。 cin 阅读全文
posted @ 2020-10-13 21:08 Ldler 阅读(85) 评论(0) 推荐(0)
摘要:题目链接 题意:给定一个字符串,求重复次数最多的连续重复子串 题目思路:先穷举长度L,然后求长度为L的子串最多能连续出现几次。首先连续出现1次是肯定可以的,所以这里只考虑至少2次的情况。假设在原字符串中连续出现2次,记这个子字符串为S,那么S肯定包括了字符r[0], r[L], r[L2],r[L3 阅读全文
posted @ 2020-10-13 20:02 Ldler 阅读(109) 评论(0) 推荐(0)
摘要:题目链接 题意: 有N(1 ⇐ N ⇐20000)个音符的序列来表示一首乐曲,每个音符都是1..88范围内的整数,现在要找一个重复的主题。“主题”是整个音符序列的一个子串,它需要满足如下条件: 1.长度至少为5个音符。 2.在乐曲中重复出现。(可能经过转调,“转调”的意思是主题序列中每个音符都被加上 阅读全文
posted @ 2020-10-13 16:50 Ldler 阅读(60) 评论(0) 推荐(0)
摘要:题目链接 题意:求字符串中出现至少 k 次的子串的最大长度 思路:出现至少k次意味着后缀排序后有至少连续k个后缀的 LCP 是这个子串。 所以,求出每相邻k-1个height[i]的最小值,再求这些最小值的最大值就是答案。 这里用的是multiset维护最小值。 #include<bits/stdc 阅读全文
posted @ 2020-10-13 14:21 Ldler 阅读(64) 评论(0) 推荐(0)
摘要:题目链接 题意:给你一个字符串,每次从首或尾取一个字符组成字符串,问所有能够组成的字符串中字典序最小的一个。 思路:首先定义两个指针L和R,如果s[L]<s[R],肯定选s[R],s[L]>s[R],选s[R].对于s[L]==s[R]的情况,可以考虑L位置的rank以及R位置反串的rank值大小。 阅读全文
posted @ 2020-10-11 19:56 Ldler 阅读(101) 评论(0) 推荐(0)
摘要:题目链接 思路:将字符串扩大两倍然后再用后缀数组排序后得出的sa数组判断得出答案 #include <iostream> #include <stdio.h> #include <cstring> #include <algorithm> using namespace std; #define M 阅读全文
posted @ 2020-10-11 15:15 Ldler 阅读(102) 评论(0) 推荐(0)
摘要:题目链接 题意:求两个串的最长公共子串长度 思路:对a串建sam,b串跑 #include <bits/stdc++.h> using namespace std; #define ll long long const int maxn=250010; char s[maxn]; struct Su 阅读全文
posted @ 2020-10-08 17:00 Ldler 阅读(84) 评论(0) 推荐(0)
摘要:题目链接 题意:求n个字符串的公共子串(n<=10,len(s[i])<=100000) 思路:将第一个字符串建立sam,把其他字符串跑到sam的每个节点的最长匹配长度记录下来。然后对于每个结点取最小,用dp数组记录。但对于每个fa[i],应该dp[fa[i]]=max(dp[fa[i]],dp[i 阅读全文
posted @ 2020-10-08 16:31 Ldler 阅读(110) 评论(0) 推荐(0)
摘要:题目链接 题意:n个模式串,一个待匹配串,求求每个模式串在待匹配串中出现次数。 思路:记录模式串尾端,然后遍历统计。 #include <bits/stdc++.h> using namespace std; const int N = 50*1010; int n; char a[1010][60 阅读全文
posted @ 2020-09-24 20:35 Ldler 阅读(115) 评论(0) 推荐(0)
摘要:题目链接 题意:给n个模式串,m个待匹配串,每个串中包含哪些模式串打印出来。 思路:主要没有看清不止小写字母导致一直wa。用一个数组记录最后结尾的状态,然后去判断一下就好了。 #include <bits/stdc++.h> using namespace std; const int N = 1e 阅读全文
posted @ 2020-09-24 20:15 Ldler 阅读(96) 评论(0) 推荐(0)
摘要:题目链接 题意:给你一个长度为n的单词表,一个文本串,问你这个文本串中出现了单词表中多少个单词; 思路:老模板题了,记录一下结尾字母累加就好了。 #include <bits/stdc++.h> using namespace std; const int N = 1e6 + 6; int n; n 阅读全文
posted @ 2020-09-23 20:42 Ldler 阅读(104) 评论(0) 推荐(0)
摘要:题目链接 题意:输出最长的前缀, 前缀要满足在原串中至少匹配3次。 思路:很容易想到前缀E和后缀E可以用next数组求出,然后在判断中间的E是否存在,具体做法是:next[len]=i,在[2 * i ,len - i](因为不能重合)内找是否有next[j]=i,存在则i就为答案,但是不存在的话不 阅读全文
posted @ 2020-09-16 12:48 Ldler 阅读(117) 评论(0) 推荐(0)
摘要:题目链接 题意:通过第一个字符与a的关系翻译字符串,输出最长回文串和首尾下标,不存在则输出No solution! 思路:马拉车算法记录修改串的最长半径和下标。然后反推原串的起点到终点。 #include<stdio.h> #include<math.h> #include<string.h> #i 阅读全文
posted @ 2020-09-16 12:44 Ldler 阅读(115) 评论(0) 推荐(0)
摘要:题目链接 题意:n个字符串,两两拼接能最多形成多少种,自己可以和自己拼接。 思路:设a,b两个串要拼接判断其是否为回文串分三种情况考虑: 第一种:alen < blen a是b的反串前缀,且b的剩余部分可以认为是后缀是回文串 第二种:alen > blen b的反串是a的前缀,且a的后缀是回文串 第 阅读全文
posted @ 2020-09-14 21:31 Ldler 阅读(115) 评论(0) 推荐(0)
摘要:题目链接 题意:求一个数组的回文串且满足条件为三角形,从小到大然后到小。 思路:在马拉车算法寻找右边len数组时添加判断条件即可。 #include<cstdio> #include<cstring> #include<iostream> #include<algorithm> using name 阅读全文
posted @ 2020-09-14 20:07 Ldler 阅读(115) 评论(0) 推荐(0)
摘要:题目链接 题意:就是要找出所有循环节的位置 思路:利用next失配数组实现跳转。长度为len-next(len)的前缀显然是符合题意的。 #include<stdio.h> #include<string.h> #include<algorithm> #define ll long long usi 阅读全文
posted @ 2020-09-14 10:29 Ldler 阅读(99) 评论(0) 推荐(0)
摘要:题目链接 题意:给你一个字符串问切一刀的最大价值。会给出26个字母的价值,而如果你切出来的一个字符串是回文串,则价值为回文串所有字母的和,否则为0.求最大价值。值得注意的是,字母价值可能为负数。 思路:可以想到马拉车算法求出P数组,然后暴力枚举。先预处理出字母价值的前缀和然后再去暴力。暴力过程中还是 阅读全文
posted @ 2020-09-14 10:25 Ldler 阅读(117) 评论(0) 推荐(0)
摘要:题目链接 题意:求本质不同的串有多少 思路:求出最小表示法,如果最小表示法的字符串不同则本质不同。用一个人set记录,最后求得size。 #include<bits/stdc++.h> using namespace std; typedef long long ll; const int maxn 阅读全文
posted @ 2020-09-11 17:18 Ldler 阅读(113) 评论(0) 推荐(0)