字符串
没4年
这个作者很懒,什么都没留下…
展开
-
POJ 3415 Common Substrings
题意:找到两个字符串所有长度大于k的公共子串个数。题解:我们需要用到后缀数组,我们已经知道一个字符串的所有子串都是这个字符串所有后缀的前缀,所以我们这题只需要枚举A串的所有后缀对B串每个后缀的贡献。举个例子:如果A串为:abab,B串为abb。我们算A串一个后缀 – ab 的贡献需要与B串每个后缀算公共前缀的长度。这样复杂度是过不去的,所以我们需要优化。我们知道height数组可以将这些后缀都分组,我们需要知道一个性质,如果已知一些后缀是一组,那么height数组大小的变化规律一定是 小 -> 大原创 2020-11-14 13:32:20 · 211 阅读 · 1 评论 -
hdu 6863 Isomorphic Strings
Isomorphic Strings题解:暴力枚举n的所有因子,判断是否合法。判断合法第一步:判断每段中各字符出现次数是否相同,第二部:判断每段的最小表示是否相同。因子还可以减枝。#include<bits/stdc++.h>using namespace std;const int maxn = 5e6+10;char s[maxn];int sum[maxn][26];int ls[26];char xka[maxn];int getmin(int st,int ed){原创 2020-08-14 13:12:31 · 187 阅读 · 0 评论 -
String Distance DP
String Distance题意:给定a,b两个串,q次询问,你可以有两种操作,每次操作可以对a串或者b串在任意位置添加一个字符,或者删除一个字符。使得al - ar 与 b 串匹配。题解:设dp[i][j],代表b串第i个字符与a串 ( l-r ) 的LCS的长度为j的最短前缀长度。我们需要预处理next[i][j]代表字符j在i+1 - n中最早出现的位置。那么dp[i][j] = min(dp[i][j],dp[i-1][j]) ; dp[i][j] = min(dp[i][j],next[dp原创 2020-07-29 14:30:00 · 184 阅读 · 0 评论 -
2020牛客多校第二场 A , J 题
J题Just Shuffle题意:已知置换 e = {1,2,…,n } 变换k次后得到一个置换a(已知),求置换e变换一次得到的置换x。题解:这题我们能想到,对于变换规则,会存在一些环,意味着变换环的大小后置换不变。我们针对每个环考虑,设环的大小为len,变换一次的状态等价于变换 len * y + 1 次,那我们从已知考虑,已知变换k次后的状态,那么我们就能推出变换 2 * k ,3 * k,4 * k , … , 次后的状态( 我们将变换k次当成一单位次的变换 )。那我们猜想如果 x *原创 2020-07-14 15:32:43 · 354 阅读 · 0 评论 -
字典树+manacher
Finding Palindromes这是一道字符串的综合题。题意:给你n个字符串,求能够拼接成多少个回文串。(拼接定义:a + b or b + a)。题解:对于字符串a,如果有字符串x的倒序与a的前缀匹配,那么它们必然能够组成回文串。同时还有如果a是字符串x的倒序后缀,如果字符串的前缀是回文串,那么也必然能拼接成回文串。举个例子: ab ba a abaa对于字符串 ab 来说 , 它与字符串 ba 的倒序 ab 的前缀匹配了,那么它们必然能够拼接成回文串, 还有的另一种情况就是,原创 2020-06-30 23:33:54 · 209 阅读 · 0 评论 -
扩展kmp的应用 Best Reward
Best Reward题意:给定一个长度为n的字符串,问你能否将这个字符串分成两个字符串,如果分成的字符串是回文子串,那么就会有价值,求分成两个串的最大价值。题解:学习到一手扩展kmp预处理后,o(1)就能判断分成的两个串是否为回文子串。s1为原串,s2为s1翻转之后的串,然后你对s2求s1的ex数组,对s1求s2的ex数组。然后再根据ex数组的定义,手推一下如何判断分成的两个串是否是回文串,具体可以看代码。#include <iostream>#include <string.h原创 2020-06-22 14:46:26 · 131 阅读 · 0 评论 -
kmp+最大最小表示
String Problem题意:你可以让长度为n的字符向左移动n次构成n个字符串,问你找到最小字典序和这个字符串出现的次数,和最大字典序字符串和这个字符串出现的次数。题解:出现次数应该都知道是最小循环节的个数。关键如何找到最小字典序和最大字典序。网上可以搜到最大最小表示的讲解和代码,设p1= 0, p2 = 0,k = 0;如果s[p1]和s[p2]不相等了,那么p1或p2就会跳,假设p1跳到p1+k+1的位置,意味着s[p1 – p1+k]不会是最小字典序字符串的前缀。举个例子:b b c原创 2020-06-19 18:16:44 · 205 阅读 · 0 评论 -
扩展kmp
网上有详细讲解,我个人觉得kmp比扩展kmp要难看的,扩展kmp主要用来解决主串的所有后缀与子串t最长的公共前缀问题,扩展kmp也能找到子串在主串中是否出现,因为如果长度为子串t的长度,那么肯定就能说明子串t在主串中出现过。借鉴了博客Corporate Identity这道题的做法,顺便学习了一下扩展kmp,其实这道题暴力也能过的,只不过好麻烦,字符串题码力就是大。#include<iostream>#include<string.h>using namespace std原创 2020-06-19 15:35:17 · 135 阅读 · 0 评论 -
KMP 简单讲解
一种O(n+m)复杂度的字符串匹配算法,复杂度是很优秀的。我们来看看kmp算法具体思路:就是不移动回移主串p的位置,进行匹配,只移动模式串t的位置。首先我们知道如果p[j]==t[k],那么就 j++ , k++; 如果p[j] != t[k];按照kmp的思路就是回退k的位置,j不移动,那么怎么回退成了这个算法的关键。定义next[j] = k,代表含义t[0 – k-1] == t[j-1 – j-k+1]匹配;而且是最大长度的匹配,网上有的称作k为最大公共前缀后缀串长度,反正你理解就好,反正公式在原创 2020-05-30 11:39:24 · 433 阅读 · 2 评论