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

浙公网安备 33010602011771号