字符串
文章平均质量分 66
My_ACM_Dream
生活没有彩排每天都是现场直播
展开
-
manacher算法模板
char s[maxn << 1];int p[maxn << 1];int Len[maxn];void manacher(){ int len = strlen(s), id = 0, maxlen=0; for(int i = len; i >= 0; --i){ s[i + i + 2] = s[i]; s[i + i + 1] = '#'; } s[0] = '*原创 2015-08-01 20:39:07 · 807 阅读 · 0 评论 -
poj 2758 Checking the Text (后缀数组应用)
题意:给出一个串,对这个串进行插入,查询,查询是按照原来串的位置进行查询a,b为开头的后缀的最长公共前缀。题解:的确是一道好题。参考大牛博客#include#include#include#include#include#include#include#include#includeusing namespace std;#define B(x) (1<原创 2015-03-09 00:19:58 · 880 阅读 · 0 评论 -
hdu 2328 Corporate Identity (后缀数组应用)
题意:给出n个字符串,求字典序最小的最长公共子串。题解:二分长度,然后用后缀数组判断是否满足,根据height分组,找出分组中包含n个字符串的后缀的分组。字典序最小也容易处理,直接看代码就好了。先前忘记了n有4000多了,结果桶排序的上限搞错了,一直wa。#include#include#include#include#include#include#include#原创 2015-03-08 15:46:11 · 541 阅读 · 0 评论 -
poj 3294 Life Forms (后缀数组应用)
题意:给出n个串,求这个n个串中至少是n/2个串的最长公共子串,注意要>n/2.题解:后缀数组的应用之一,做法:1、将n个字符串拼接在一起,每个字符串拼接的符号最好是小于所有串的,这样排序以后会跑到开头,比较好处理,其实可以将字符串装化为int,同时加上10,这样会省去很多麻烦。2、跑一边后缀数组,,二分答案,判定答案:根据height进行分组(这种方法经常有),每组的公共前缀原创 2015-03-07 10:43:03 · 650 阅读 · 0 评论 -
yy浅谈后缀数组
后缀数组是一种很优美的数组结构,基本上可以完全替代后缀数,后缀数组无论是在内存的占用或者是时间复杂度都和后缀树差不多,但是操作性比后缀树好很多。后缀数组可以说是字符串处理的神奇啊!想的到的,想不到的都可以处理。后缀数组的应用也是十分的广泛。后缀数组普遍可以通过O(nlogn)的复杂度解决很多问题。一下是一些例题和后缀数组的一些应用。1、求两个串后缀的最长公共前缀,height数组原创 2015-03-07 14:38:20 · 1092 阅读 · 0 评论 -
poj 1226 Substrings (后缀数组应用)
题意:给出n个串,求一个最长的串,使得这个串或是这个串反转后的串出现在n个串中。题解:将每个串反转接到原串后面,用分隔符分开,然后就可以像求最长公共子串那样做了。#include#include#include#include#include#include#include#include#includeusing namespace std;#define B原创 2015-03-07 21:26:12 · 479 阅读 · 0 评论 -
poj 3581 Sequence (后缀数组好题)
题意:给出一个字符串,求这个字符串分成三段并且反转着三段得到字典序最小的序列。题目保证第一个字符最大。题解:题目保证第一个字符最大是非常有用的条件,我们可以用贪心,将字符串倒叙,找到字典序最小的后缀作为第一段,注意最小要字典序是在不会导致有一段是空串的前提下,例如 4 3 2 1 明显倒序后最小后缀时1 2 3,但是这样不可取,因为如果去1 2 3,那么其他两段就是空串了!这是求出了第原创 2015-03-08 13:13:13 · 622 阅读 · 0 评论 -
poj 3415 Common Substrings (后缀数组应用)
题意:给出两个串,求着两个串的公共子序列至少是k长度的个位数(允许重复)题解:先是看了国家队论文得到了点启示,然后具体是想出处理的办法,但是操作起来各种不顺,之后参照了别人的代码,了解到了一种和我做法一样的处理方法。启示这题相当于贪心,对于任意两个后缀(分别是A串和B串的),对于这两个后缀,如果最长前缀是L,那么要得到至少是k的长度那么L>=k,于是很容易可以看出这个两个后缀为整个原创 2015-03-06 20:17:49 · 594 阅读 · 0 评论 -
spoj 220 Relevant Phrases of Annihilation (后缀数组应用)
题意:给出n个串,求着n个串最长公共子串,并且子串在各个串中至少重复两次,并且不能重叠的重复。题解:这里又用到了后缀的分组,我们首先拼接n个串然后跑一边后缀数组,二分长度,接着根据height分组,然后统计每组的后缀所属的串的个数,并且要判断是否存在至少重复两次的子串且不重叠,统计所属串的个数可以用set存,然后获取size即可,对于后一个问题,我们将每次分得的组统计所属每个串的SA[原创 2015-03-07 14:31:02 · 574 阅读 · 0 评论 -
对于最长连续重复子串伤感经历
最长连续重复子串问题,一般是问重复的最大数,更强的就是要求输出字典序最小的一个答案。对于这种问题,我们没有什么好办,只能枚举重复子串的长度L,在纸上写些数据会发现,重复子串会覆盖s[0],s[L],s[2*L],...,S[i*L]其中相邻的两个。这样求s[i*L]和s[(i+1)*L]的最长公共前缀为k,通过测试数据会发现这样的规律,重复次数r=k/L+1;这样做只能说肯定能找到对应的连续重原创 2015-03-06 00:56:28 · 877 阅读 · 0 评论 -
poj 2406 Power Strings (用kmp代替后缀数组求解)
题意:给出一个串,这个串是由R个子串重复得到,求最大的这个R。题解:算法集合之《后缀数组》国家对论文是说用后缀数组可以处理复杂度是O(n),但是感觉大材小用了,这题用kmp完全可以解决。#include#include#include#include#include#include#include#include#includeusing namespace st原创 2015-03-04 22:00:36 · 581 阅读 · 0 评论 -
poj 3261 Milk Patterns (后缀数组+二分答案)
题意 :给出n个数,求n个数组成的串的子串中满足重复k次并且长度最长。题解:二分枚举长度,然后判断是存在这样的串,判断方法将后缀分组,然后只要判断是否存在这样的组:里面有至少k个后缀。注意,n个数可以为0,所以全部加1。#include#include#include#include#include#include#include#include#includeu原创 2015-03-04 20:56:43 · 562 阅读 · 0 评论 -
poj 1743 Musical Theme (后缀数组+二分答案)
题意:给出n个数字的串,将这个串后一个减去前一个,所得的串尽心操作。问所得的串最长不重复子串的长度。题解:这种题目很明显没办法直接求得长度,那么可以考虑二分答案判断是否满足条件。我们可以二分得到k,判断是否存在这样的k。对于如何判断,我们可以将后缀根据height的值进行分组,每组的后缀之间的最长公共前缀必须至少为k,这样之后只要找出每组中最大SA值和最小SA的值的差即可。好好理解下,原创 2015-03-04 17:55:38 · 645 阅读 · 0 评论 -
spoj 694 Distinct Substrings (后缀数组应用)
题意:给出长度为n的串,求这个串中不通的子串个数。题解:首先我们分析,这种题应该从每个子串入手,每个子串肯定是后缀的前缀,所以分析后缀的一些关系。单独分析一个后缀能为不通子串个数贡献多少,如果按照SA的顺序不断计算出后缀,当要加入k这个后缀时,他的长度为n-SA[k],那么他可以贡献出的前缀也就是子串的个数肯定有n-SA[k],但是他和前一个后缀有重叠部分重叠部分的长度便是多计算的子串原创 2015-03-04 21:21:23 · 502 阅读 · 0 评论 -
hdu 1403 Longest Common Substring (后缀数组模板题)
题意:求两个串的最长公共子串。题解:后缀数组搞定。#include#include#include#include#include#include#include#include#includeusing namespace std;#define B(x) (1<<(x))typedef long long ll;const int oo=0x3f3f3f原创 2015-03-04 13:57:22 · 544 阅读 · 0 评论 -
hdu 5164 Matching on Array (奇葩版ac自动机)
题意:给出一个a序列,m个b序列,a能通过倍数关系能出现多少b串。例如a{ 2 4 8 } b{ 1 2 } 那么a中的{ 2 4 } 和{ 4 8 } 是可以通过b序列通过倍数变成的。题解:我们可以把串进行缩放,然后缩放后的串进行匹配。对于m==1的情况用kmp 其他情况用ac自动机。搞一个分数类进行处理。自动机的边用map,对奇葩的地方就是这里,用map做边,map>next原创 2015-03-03 23:07:13 · 545 阅读 · 0 评论 -
hdu 3962 Microgene (ac自动机+矩阵优化(好题))
题意:给出n个串,现在要求长度为L的串至少包含着n个串中的两个串的个数。题解:一看这种计数类问题要么dp,要么矩阵乘法。dp明显内存时间都爆。那么可以考虑用矩阵乘法,首先如果直接用矩阵存不包含任意n个字符串,L次幂,将maze[0][i]相加得到长度为L的不包含任何n个串对应串的个数,然后在计算全部的情况,这样就缺包含一个字符串对应串的个数这个方案了,之前用枚举N个字符串哪个出现了进行原创 2015-03-03 19:38:38 · 621 阅读 · 0 评论 -
zoj 3535 Gao the String II (ac自动机+dp)
题意:给出A集合有m个穿,B集合有n个串,现在要求A集合中的串进行组合成长度不超过L的串S,是的包含最多B集合的串。题解:这题真心orz。dp[i][j][k]表示长度为i,在ac自动机上的状态j,并且是以k为结尾的A中的串。预处理出每个A集合中的串和其他A集合中的串拼接的长度,因为任何两个串拼接的长度可以有多个,所以暴力枚举拼接的长度然后判断是否可行。注意:空串可以拼接任何串在开原创 2015-03-03 16:13:48 · 745 阅读 · 0 评论 -
hdu 4691 Front compression (后缀数组+rmq)
明知道水题,就是读不懂题目。#include#include#include#include#include#include#include#include#includeusing namespace std;#define B(x) (1<<(x))typedef long long ll;const int oo=0x3f3f3f3f;const ll OO=1原创 2015-03-09 17:10:06 · 578 阅读 · 0 评论 -
spoj 1811 Longest Common Substring (第一道后缀自动机)
题意:给出连个串求两个串的最长公共子串。题解:dp肯定过不了复杂度高。后缀数组可以过。我用后缀自动机做,第一次写后缀自动机,举得和ac自动机相似都是一种状态转移图。参考了大牛的模板自己改了下写出自己的模板。这题将第一个串加入后缀自动机,然后去匹配第二个串。很裸的题目。#include#include#include#include#include#include#i原创 2015-03-09 20:51:02 · 504 阅读 · 0 评论 -
hdu 4552 怪盗基德的挑战书 (kmp+dp)
求前缀出现的个数,for all i the dp[i]=1 , dp[next[i]]+=dp[i];#include#include#include#include#include#include#include#include#includeusing namespace std;#define B(x) (1<<(x))typedef long long ll;原创 2015-03-09 18:10:32 · 538 阅读 · 0 评论 -
codeforces 182D Common Divisors (kmp,next应用)
题意:题意很简单,就是求两个串公约串的个数。题解:要得到两个串的next数组求出格子的最小循环节,然后判断四种情况1、a==len1&&b==len22、a==len1&&b==len13、a==len2&&b==len24、a==b 对于这种情况我是通过很多实例得出的,因为在123都不满足时,如果最小的循环节长度不同是不可能有公约串的。#include#incl原创 2015-02-22 16:22:46 · 555 阅读 · 0 评论 -
codeforces 432D Prefixes and Suffixes (kmp+dp)
题意:给出一个串,求这个串种即使前缀又是后缀的子串在这个串出现的次数。题解:首先得到next数组,然后定义dp[i]表示长度为i的前缀出现的次数。很好理解了,dp[next[i]]+=dp[i],dp初始化为1。#include#include#include#include#include#include#include#includeusing name原创 2015-02-22 19:13:39 · 697 阅读 · 0 评论 -
codeforces 56D Changing a String (dp编辑距离)
题意:给出两个串,问第一个串变成第二个串的最小操作以及具体操作要输出,操作有删除、插入、替换。题解:dp[i][j]表示第一个串在i,第二个串在j时的最小操作数,删除操作dp[i-1][j],插入操作dp[i][j-1],替换操作或不操作dp[i-1][j-1]。路径打印可以记录路径或者用通用方法(dfs回溯)。#include#include#include#i原创 2015-02-14 13:05:34 · 604 阅读 · 0 评论 -
codeforces 126B Password (kmp,next应用)
题意:给出一个串,求出这个串中公共前后缀的最长长度,但是这个最长长度要能在除了前缀和后缀的中间找到。题解:next应用#include#include#include#include#include#include#include#includeusing namespace std;#define B(x) (1<<(x))typedef long long原创 2015-02-21 21:26:24 · 570 阅读 · 0 评论 -
hihoCoder 1084 扩展KMP(后缀数组)
题意:给出两个串,A和B,问A串中有多少个子串和B是‘匹配’的。这里的匹配要满足:将一个字符串转化为另一个字符串所需要改变字符的最小数目。对于A中的一个子串,如果它的长度和B的相同且它们之间的海明码距离不超过k,我们认为它们是匹配的.题解:用后最数组匹配A的正串的每个后缀和B的正串的最大匹配数,相反同样用后缀数组匹配A的反串的后缀和B的反串的最大匹配。分别用f[i][0]和f[i]原创 2015-04-27 00:13:20 · 1087 阅读 · 1 评论 -
FJUTOJ 校赛H 你明明自己也生病了,却还是要陪着我 (字典树)
题意:题目给出两个操作,1是插入字符串,2是询问这个字符串是否是之前插入的字符串前后缀的组合或者这个字符串本身就是之前插入的字符串的前缀或后缀。题解:直接字典树搞,弄两个字典树,一个存前缀,一个存后缀,然后查询时去两个字典树中查找,如果两个搜到的两个位置相加>=len,那么是可行的。#include #include#include#include#include#inc原创 2015-04-13 21:51:12 · 641 阅读 · 0 评论 -
hdu 4416 Good Article Good sentence (后缀数组)
题意:给出一个串a,和n个串b,现在问a串的子串中在b中未出现的个数。题解:全部链接计算不同子串个数sum1,链接b串计算不同子串个数sum2,然后用sum1-sum2就是答案。因为先计算全部的在计算b的,所以我们将a串存在最后面,这样在计算第二次的时候就可以很快处理。#include#include#include#include#include#include#原创 2015-03-13 23:31:05 · 489 阅读 · 0 评论 -
BZOJ 2806 Cheat (后缀自动机+dp)
题意:给出m个串组成的文章,在给出n个串,求n个串每个串的一个最优划分,划分:将串分成多分子串,L0表示其中能在文章中找到的子串的长度和,maxl表示其中子串的最大长度,在保证L0>=90%总长度前提下使得maxl最大,求出这个最大的maxl。题解:我们分析下这样的题,很明显要满足两种条件不易,那么我们可以枚举maxl,然后判断是否符合条件,对于如何判断我们可以用dp处理,dp[i]表原创 2015-03-14 12:04:47 · 686 阅读 · 0 评论 -
uva 719 Glass Beads (后缀自动机)
题意:给出一个串,如bcdaf长度n=5,可以将串头尾相连,在这个循环串中求字典序最小且长度为n的串的开头点位置。题解:后缀自动机中遍历dfs找到第n个点对应的肯定是长度为n字典序最小的子串,并且结尾点就是遍历的结尾点。#include#include#include#include#include#include#include#include#inclu原创 2015-03-10 20:40:44 · 893 阅读 · 0 评论 -
hdu 4436 str2int (后缀自动机+dp)
题意:给出n个串然后,求着n个串所有子串对应的数字的和是多少。题解:根据陈立杰的论文我们得出这样的性质,从s开始遍历自动机,走到任意一个u,那么走过的字符构成的串肯定是整个串的子串,简单来说就是从起点到某个点构成了一个子串。那么我们就可以根据这性质计算。其实我们将串对应的数组分成不同位数进行计算,类似于数位dp的思想。dp[u]表示到节点u时构成的数位对应的数字和,那么u的下个节点v有原创 2015-03-11 19:43:43 · 732 阅读 · 0 评论 -
hdu 4622 Reincarnation (后缀自动机)
题意:给出一个串,q个询问,每个询问要求这个区间[l,r]不同子串的数目。题解:这题有两种做法,一种是后缀数组,一种是自动机,两种方法的思想是一致。用自动机做之前要知道一个性质:每次加入某个字符,会到len[last]-len[fa[last]]个未出现过的子串,并且都是以last为结尾的。那么就好办了,我们并不好在在线获得答案,我们先将询问存下来,然后通过排序按照区间左端点为第一原创 2015-03-10 15:51:59 · 593 阅读 · 0 评论 -
spoj 7258 Lexicographical Substring Search (后缀自动机+dp)
题意:给出一个串,q个询问,每个询问求第k大字典序的子串。题解:高了好久,终于对后缀自动机略有了解了。这题我们根据自动机中len的大小排序,为的是统计各个子串出现次数做准备,为什么要统计次数呢?自动机存的一个字典图,如果能得到通过某个点能达到其他点的路径数,就可以根据路径数来得到字典序的信息,具体做法是: 1、首先我们定义dp[node]表示经过node这个节点能达到其他节点的路径数。原创 2015-03-10 13:56:14 · 571 阅读 · 0 评论 -
spoj 8222 Substrings (后缀自动机+dp)
题意:给出一个串,定义这样的F(x){ 表示在长度为x的串中出现次数最多的串的长度 },求出F(i) 1题解:刚接触后缀自动机不会很懂,多亏大牛 在做这题前最好看下陈立杰的写的关于后缀数组的论文。论文中提到right(s),表示从s状态出发能到达的所有串的最后一个点的一个集合。len[i]表示在建后缀机的过程中某个过程对应的后缀长度,注意最后不一定会是整个串的后缀,但是可以将len[原创 2015-03-09 23:26:30 · 666 阅读 · 0 评论 -
codeforce 271D Good Substrings (后缀自动机+dp)
题意:给出一个串,和一个01串,01串只有26个字符,每个字符对应26个英文字母表示这个字符是否是好的,1表示好的,0表示不好的。所给的串中多少个不同子串至多包含k个坏字母。题解:这题没想到用dp来做,一直去想性质,其实用dp做挺简单的。dp[i][j]表示在后缀动机上的i点,现在有j个坏字母对应子串的个数。明显:dp[i][k]+=dp[next[i][j]][k] if(alp原创 2015-03-15 17:13:13 · 807 阅读 · 0 评论 -
zoj 3494 BCD Code (ac自动机+数位dp)
题意:给出n个非法串,给出一个范围,求这个范围的数转成定义串不包含非法的个数。所谓定义串,举个例子比如27,7的二进制是0111,2的二进制是0010 那么27变成定义串就是 0010 0111。题解:明显是数位dp,ac自动机上的数位dp。一开始把数字全弄成二进制来做,也是脑残了。直接数位dp,dfs就好了,状态很简单dp[pos][i]位数pos,在自动机上i点。注意高进度的减法,原创 2015-02-26 14:26:08 · 556 阅读 · 0 评论 -
hdu 2825 Wireless Password (ac自动机+状压dp)
题意:给出m个串,现在一个n个字母的字句里面必须包含至少p个m集合中的串。问有多少种方式。题解:kuangbin说ac自动机状态转移图什么,不是很懂。但是抛开这个,去思考也是可以做的。我们在ac自动机上dp肯定要设置这样的状态dp[i][j]走了i步,结尾是j节点,但是这样明显无法获得由几m集合中的串,分析发现这类似排列组合,要实现这样的计数问题,只能是状压dp,那么我们多设置一维dp原创 2015-02-24 11:20:19 · 531 阅读 · 0 评论 -
poj 1625 Censored! (ac自动机+dp)
题意:一个神奇的国度他们字母类型有n个,并且每句话必须是m个字母组成的,但是国王很奇葩,他设定了一些单词,只要句子中出现这样的单词那么造句的人就好入狱。给出了p个不能出现的单词。问有多少种句子可以出现。题解:ac自动上的dp,第一次做参照了bin神的代码,很神奇啊,ac自动机上也可以dp 0 0!好了我以自己理解来分析这题。首先,我们要将所给的n个字符进行处理,因为这n个字符有原创 2015-02-23 20:46:14 · 560 阅读 · 0 评论 -
hdu 3247 Resource Archiver (ac自动机+BFS+状压dp)
题意:给出n个资源串,m个病毒串,现在要如何连接资源串使得不含病毒串(可以重叠)。题解:真心不会做。这题注意点好多,稍不留意就wa。看了题解我是这样理解的,我么可以把资源串和病毒串都放到ac机上,这样的做是为了把病毒串挑掉。在建ac机时,通过判断fail指针对应节点是否是病毒串,然后将fail指针的内容根性到这个节点。同理对于资源串也用相同方法。我们这样设置标记,病毒串ID=-原创 2015-02-25 21:31:58 · 536 阅读 · 0 评论 -
hdu 3341 Lost's revenge (ac自动机+状压dp)
题意:给出目标串,给出n个模式串,现在问如何排列目标串使得目标串能含最多的模式串(可以重叠)。题解:好题!这题用状压,很明显只能用状压,一开想的也是状压但是没想到这样去状压。我们枚举串出现AGCT的个数,然后得到状态转移。代码犯了几个脑残的错误,word[now]++,word[now]+=word[fail[now]];上次犯用手写队列被卡内存了,甚是无语,看来以后还是用容器原创 2015-02-25 19:22:53 · 675 阅读 · 0 评论