前缀 & 后缀
SuPhoebe
不是我针对谁,我是说在座的诸位都比我强
展开
-
HDU 4964 Emmet
出神入化的string#include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include转载 2014-08-19 23:26:04 · 762 阅读 · 0 评论 -
HDU 5442 Favorite Donut
第一种方法,最小表示法 其实呢,你将每一个字母反转一下,将’a’变成’z’,就是最小表示法。 但是反转之后,我们如果用最小表示法,得到的是,在原串上位置最靠后的情况,与题意不服,所以我这里就强行将之往后硬判,最坏复杂度是当串所以的字符都相同的情况,退化成O(n2)O(n^2)。// whn6325689// Mr.Phoebe// http://blog.csd原创 2015-09-13 21:25:01 · 712 阅读 · 0 评论 -
HDU 3518 && HDU 4416【后缀自动机len的使用】
max:即代码中 len 变量,它表示该状态能够接受的最长的字符串长度。 min:表示该状态能够接受的最短的字符串长度。实际上等于该状态的 fail 指针指向的结点的 len + 1。 max-min+1:表示该状态能够接受的不同的字符串数。那么在HDU 3518 中。 求的是,不相交且出现次数大于2的子串个数。 我们这么想,如果你把一个串直接塞进后缀自动机里面,比较难以处理(不是没有办法,原创 2015-08-28 10:43:39 · 1410 阅读 · 0 评论 -
最长公共子串问题的后缀数组解法
二分枚举答案A,假设N个串可以有长度为A的公共字串,并对A的可行性进行验证。如果验证A可行,A'(A'于是问题就集中到了,如何验证给定的长度A是否为可行解。方法是,找出在Height数组中找出连续的一段Height[i..j],使得i=A,并且i-1具体查找i..j时,可以先从前到后枚举i的位置,如果发现Height[i]>=A,则开始从i向后枚举j的位置,直到找到了Height[j+1]原创 2015-01-28 00:26:41 · 1052 阅读 · 0 评论 -
Codeforces Round #305 (Div. 1)E. Mike and Friends【后缀数组+线段树】
传送门:Codeforces Round #305 (Div. 1)E. Mike and Friends这题既然求得是子串,就可以用后缀数组来做(也可以用后缀自动机balabala) 我的方法是O(nlog2n)O(nlog2n),O(nlogn)O(nlogn)的方法就是把线段树换成主席树来实现,但是我并不会高冷的主席树。 首先用类似于求N个串的最长公共子串那样,将所有串接在一起,然后用后缀原创 2015-05-31 20:56:43 · 876 阅读 · 0 评论 -
【字符串新武器】后缀自动机
发链:http://neroysq.blogcn.com/articles/%E5%90%8E%E7%BC%80%E8%87%AA%E5%8A%A8%E6%9C%BA%E5%88%9D%E6%8E%A2.htmlhttp://blog.sina.com.cn/s/blog_7812e98601012cim.html详细构造见上述链接,此处介绍性质与理解后缀自动机具有两大转载 2015-06-04 20:48:51 · 635 阅读 · 0 评论 -
SPOJ Longest Common Substring II
求十个串的最长连续公共子串。 第一个串建立自动机。 用其它每个串在自动机上跑一遍,记录每个状态上能匹配的最长长度。 然后求每个状态匹配长度的最小值。注意每个状态能匹配的,每个状态的父节点也能匹配。 利用拓扑排序(按照len),从深到浅依次更新父亲的匹配长度。模板敲错了,TLE了一个早上。// whn6325689// Mr.Phoebe// http://b原创 2015-08-17 18:11:39 · 469 阅读 · 0 评论 -
SPOJ 8222 Substrings
题意: 给一个字符串S,令F(x)表示S的所有长度为x的子串中,出现次数的最大值。 求F(1)..F(Length(S)) Length(S) <= 250000题解: 我们构造S的SAM,那么对于一个节点s,它表示的串长度范围是[Min(s),Max(s)],同时他的出现次数是|Right(s)|。那么我们用 |Right(s)|去更新F(Max(s))的值。同时最后从大到小依次用F(i原创 2015-08-18 11:00:04 · 608 阅读 · 0 评论 -
HDU 5343 MZL's Circle Zhou【后缀自动机】
对于a串可能和b串重复的部分,我们总能找到一个位置将该串分成前半段和后半段,同时使得前半段属于a串的部分达到最长,即在该串划分的位置后面的那个字母在属于a串的部分的后继为空(也就是说不能找到更长的前半段划分方式了),所以我们只要预处理以字符x为开头的b串的个数即可。 然后在A的每一个子串枚举算后面有没有以字符x为开的后继。新建图// whn6325689// Mr.Phoeb原创 2015-08-11 10:08:44 · 679 阅读 · 0 评论 -
GYM 100685 K
乱搞题 统计每一个不是magic word的单词,然后每个make_pair 然后按照公式计算答案。 因为这里是乱序的统计make_pair的情况,所以如果相邻的是相同的就会多统计一倍,在计算答案的是就要去掉,如果你保证字典序小的在前面,那就无所谓啦。// whn6325689// Mr.Phoebe// http://blog.csdn.net/u01300原创 2015-09-01 17:00:07 · 516 阅读 · 0 评论 -
Bupt summer training for 2013_String
A - Crazy Search(P)原创 2014-08-05 21:30:15 · 719 阅读 · 0 评论 -
Zoj 3587 Marlons String
题意: 给定两个串S和T,从S中找两个子串组成T(拼起来和T一模一样),两个子串可重叠,问有几种组合方法?三种方法: KMP+计数 直接用T去匹配S,匹配到T中的T[j]时,说明长度为j的前缀出现了,更新sum[j],然后通过递归计算sum[next[i]] += sum[i]。为什么要这样计算呢?因为当某个前缀是另一个前缀的后缀时,会出现少计算的情况,更新的时候只更新后面那个前缀的出现次数而原创 2015-07-15 11:21:59 · 613 阅读 · 0 评论 -
Codeforces Round #327 (Div. 1) E. Birthday【AC自动机+网络流】
先用AC自动机处理子串的问题 这是简单的处理,和沈阳站的B题简直异曲同工。 然后形成了一个DAG图用网络流Dinic处理最大独立集的问题,胡伯涛的论文有提及二分图的最大独立集做法。 方案直接用bfs在Dinic最大流跑完之后的残留网络上面询问,能够访问到的点就是方案。// whn6325689// Mr.Phoebe// http://blog.csdn.ne原创 2015-10-27 23:50:56 · 1135 阅读 · 2 评论 -
【后缀数组学习】
原文转载自博客,但有部分修改。模板后缀数组是解决一系列字符串题目的利器,后缀数组中保留了这样的信息。sa[i]表示排名为第 i 位的后缀是从sa[i]开始的。通过倍增算法可以在O(nlogn)的时间复杂度内将所有的后缀进行排序。而height数组也是在处理问题中经常要使用到的,height[i]表示排名第 i 的后缀与排名第 i-1 位的后缀的最长公共前缀的长度。具体见代码。#include <cs原创 2015-09-17 21:55:58 · 659 阅读 · 0 评论 -
POJ 3415 Common Substrings【后缀自动机】
max:即代码中 len 变量,它表示该状态能够接受的最长的字符串长度。 min:表示该状态能够接受的最短的字符串长度。实际上等于该状态的 fail 指针指向的结点的 len + 1。 max-min+1:表示该状态能够接受的不同的字符串数。 right:表示节点u所能够接受的字符,在原字符串中出现过多少次 right*(max-min+1)就是节点u能够接受的字符串在原字符串中出现的次数。原创 2015-09-18 12:02:11 · 888 阅读 · 0 评论 -
HDU 4436 str2int【后缀自动机】
后缀数组也能做这题。首先,我们先想到的是,根据数据范围,肯定是字符串的数据结构。因此想到了后缀自动机。那么后缀自动机就起到了去重的功能。先将所有的串加上间隔符号,加入SAM,再拓扑排序。于是,对于每一个节点都可以表示多个十进制数字。 我们就可以在后缀自动机建立的图上面进行转移。 每次从父亲节点转移到儿子节点,父亲节点能够表示的所有数字都要乘以10,再加上儿子节点表示的数乘以父亲节点表示的串的个数原创 2015-09-25 17:21:48 · 547 阅读 · 0 评论 -
Codeforces Round #267 (Div. 2) D. Fedor and Essay
注意有可能有环的情况所以DFS要两遍原创 2014-09-19 18:54:31 · 713 阅读 · 0 评论 -
Poj 3691 & Hdu 2457 DNA repair
解题思路:AC自动机+DPdp[ i ][ j ]表示主串匹配到了第 i 个位置,然后到达的是AC自动机上的 j 状态(可以理解为Trie树的节点位置)时最少修改字符的个数,我们保证 j 状态不是模式串( DNA病毒串)的结束节点,然后不断地往后走选出一条匹配完主串,并且修改字符串数最少的的一条。状态转移为dp[ i ][ j ] = min( dp[ i ][ j ],原创 2014-08-11 12:06:51 · 802 阅读 · 0 评论 -
Phoebe implementation invitational for 2014 tiro 3.0 部分题解
A。给出两个非负整数a,b,求出符合这个等式 的所有x,并输出 x 的数量,如果 x 有无限多个,那么输出 infinity。a mod x == b,等价于 a = k*x + b。设 mul = a - b,那么 k*x = mul,然后就不断枚举 mul 的因子,即 kx = mul。由于 mod 出来的结果为 b,那么 k 或 x 至少有一个比 b 大,如果两个原创 2014-12-23 22:27:27 · 755 阅读 · 0 评论 -
Codeforces Round #289 (Div. 2, ACM ICPC Rules) E. Pretty Song
E. Pretty Songtime limit per test1 secondmemory limit per test256 megabytesinputstandard inputoutputstandard outputWhen Sasha was studying in the seventh grade,原创 2015-02-03 11:49:06 · 701 阅读 · 0 评论 -
BUPT OJ 147. Substring
时间限制 1000 ms 内存限制 65536 KB题目描述There're two strings S and T formed by English letters (lowercase and uppercase). You are required to find a longest substring R from string S, that string R原创 2015-04-05 19:29:35 · 630 阅读 · 0 评论 -
HDU 5371 Hotaru's problem
利用Manacher求出每两个数字中间位置的回文长度之后利用set进行维护,大题思路如下:要满足题目所要求的内容,需要使得两个相邻的回文串,共享中间的一部分,比如上边的两个字符串,共享 8 9 10这一部分。 也就是说,左边的回文串长度的一半,要大于等于共享部分的长度,右边回文串也是一样。 因为我们已经记录下来以第i个点和第i+1个点为中心的回文串长度, 那么问题可以转化成,相距x的两个数a[i],原创 2015-08-12 10:24:30 · 528 阅读 · 0 评论 -
HYSBZ - 2434 && Codeforces 163 E【AC自动机+dfn序列】
两道题都是建立逆fail树,进行区间操作。阿里的打字机// whn6325689// Mr.Phoebe// http://blog.csdn.net/u013007900#include <algorithm>#include <iostream>#include <iomanip>#include <cstring>#include <climits>原创 2015-08-26 21:15:30 · 573 阅读 · 0 评论 -
UVALive 4811 Growing Strings【AC自动机+简单dp】
AC自动机 给出n个字符串,问最多能够选出多少个串组成序列,并满足前一个字符串是后一个字符串的子串。 这个和上一题类似,但是更加简单。 对于AC自动机,我们知道的是,父亲节点是它所以儿子节点的前缀,fail[i]fail[i]节点是ii节点的后缀,因此都是它的子串。 那么我们可以考虑dp的情况。 dp[u]=max(dp[fa[u]],dp[fail[u]])+end[u]dp[u]=ma原创 2015-09-25 09:12:56 · 682 阅读 · 0 评论 -
BZOJ 3530 数数【AC自动机+数位dp】
[Sdoi2014]数数简单数位dp+简单AC自动机 反正数位DP是队友写的 AC自动机要记录两个值,一个是是否为一个串的结束,即不合法状态,一个是前缀零的情况。// whn6325689// Mr.Phoebe// http://blog.csdn.net/u013007900#include <algorithm>#include <iostream>原创 2015-10-02 21:42:37 · 787 阅读 · 0 评论 -
HDU 4117 GRE Words【AC自动机+线段树】
和这题有些类似。AC自动机。 字符串匹配算法,大概就是kmp,ac自动机,后缀数组,后缀自动机这么几种了。对于这题,我们很容易想到暴力dp,用kmp去匹配,总复杂度可以做到o(n2+2∗m)o(n^2+2*m)(n为字符串个数,m为所有字符串的总长),但这样还不够,超时妥妥的。 那就要考虑怎么维护这个dp了。 把自动机建好后,从前往后一个个的,去匹配。在自动机上匹配的过程中,我们可以发现,这个原创 2015-09-23 21:42:43 · 928 阅读 · 0 评论 -
HDU 4057 Rescue the Rabbit 【AC自动机+状压DP】
题目: 给出一些模式串,每个串有一定的价值,现在构造一个长度为M的串,问最大的价值为多少,每个模式串最多统计一次。由于每个模式串最多统计一次,也算是降低了难度,最多10个串,容易想至于状态压缩。 AC自动机上的节点最多1000=100∗101000=100*10个,而最终的串长度最多为100.容易想到的DP暴力转移。 dp[i][j][k]:表示长度为i的串,位于AC自动机上的节点j,模式串的原创 2015-09-24 17:12:36 · 724 阅读 · 0 评论 -
Educational Codeforces Round 12 E. Beautiful Subarrays
题意: 问有多少个连续区间异或和大于等于k思路: sum[l,r]= sum[1,l-1] ^ sum[1,r]所以记录异或前缀和,并用字典树维护从高位开始插入,num维护有多少数的前缀等于插入路径的,只要高位异或大于等于k,则之后肯定满足;否则,必须将cur的那一位置为1,然后继续。(因为退役已久,写了一发样例都没过,于是改着改着就改成codeforces的tutorial的样子,最后发现是我原创 2016-04-23 15:37:04 · 641 阅读 · 0 评论 -
Twosigma在线笔试 substring
题意给你一个字符串,让你找出这个字符串以元音字母开头(a,e,i,o,u),辅音字母结尾的所有子串,中的字典序最大串和最小串。思路虽然是面试题,但是我觉得这是我见过的最难的面试题暴力解#include<iostream>#include<unordered_set>#include<string>using namespace std;...原创 2018-09-19 21:08:58 · 2593 阅读 · 1 评论