--------字符串算法--------
Neo__Z
这个作者很懒,什么都没留下…
展开
-
NOIP模拟 字符串【后缀数组+稀疏表】
题目描述给定两个字符串 s 和 t ,两个字符串都由 26 个小写字母中的部分字母构成。现在需要统计 t 在 s 中出现了的次数。 对于 s1 中的每个位置 i ,设 strlen(s2)=m ,若: ∑mj=1[s[i+j−1]!=t[j]]≤k\sum^m_{j=1}[s[i+j-1]!=t[j]]\le k (最外层中括号为布尔表达式) 则认为 t 在 s 的 i 处出现了一次,现在想原创 2017-11-10 08:06:14 · 287 阅读 · 0 评论 -
bzoj4567: [Scoi2016]背单词【trie树+贪心】
DescriptionLweb 面对如山的英语单词,陷入了深深的沉思,“我怎么样才能快点学完,然后去玩三国杀呢?”。这时候睿智 的凤老师从远处飘来,他送给了 Lweb 一本计划册和一大缸泡椒,他的计划册是长这样的: ————— 序号 单词 ————— 1 2 …… n-2 n-1 n ————— 然后凤老师告诉 Lweb ,我知道你要学习的单词总共有 n 个,现...原创 2018-03-24 16:31:21 · 268 阅读 · 0 评论 -
bzoj4943: [Noi2017]蚯蚓
解题思路:感觉这题巨水,k很小,每次操作最多会产生或减少k^2个字符串,直接用哈希表暴力统计贡献就行了。难怪uoj差评……#include<bits/stdc++.h>#define ll unsigned long longusing namespace std;int getint(){ int i=0,f=1;char c; for(c=getch...原创 2018-04-09 08:58:05 · 224 阅读 · 0 评论 -
bzoj3879: SvT【后缀数组+稀疏表+单调栈】
Description(我并不想告诉你题目名字是什么鬼)有一个长度为n的仅包含小写字母的字符串S,下标范围为[1,n].现在有若干组询问,对于每一个询问,我们给出若干个后缀(以其在S中出现的起始位置来表示),求这些后缀两两之间的LCP(LongestCommonPrefix)的长度之和.一对后缀之间的LCP长度仅统计一遍.Input第一行两个正整数n,m,分别表示S的长度以...原创 2018-04-11 21:00:20 · 309 阅读 · 0 评论 -
BJ模拟 最长公共前缀【树上后缀数组】
题目大意:bzoj3879的树上版本,trie树上每个节点到根的路径都看做是一个后缀。解题思路:建一波树上后缀数组,再用bzoj3879的方法(这里)即可。 第一次写树上后缀数组,全靠yy,好多地方被普通后缀数组带偏,细节见代码。#include<bits/stdc++.h>#define ll unsigned long longusing namespac...原创 2018-04-12 21:14:59 · 998 阅读 · 0 评论 -
BJ模拟 String【后缀自动机+LCT+可持久化线段树】
题目描述:给你一个长度为n的字符串S,你需要维护这个字符串S并支持两种操作: 1、在字符串S末尾插入一个字符。 2、记字符串T为字符串S从第 l 个字符到第 r 个字符所构成的子串。询问字符串T中最长的子串使得该子串在T中出现过至少两次(例如:T=”ababa”,最长的子串应为aba,长度为3),并输出它的长度。如果不存在这样的子串,则输出0。 强制在线,n,m<=50000。...原创 2018-04-23 10:49:55 · 580 阅读 · 0 评论 -
BJ模拟 Different Trips【树上后缀数组】
题目描述:CJB来到HZ王国旅游。HZ王国给CJB留下了深刻的印象,特别是HZ王国的道路系统。HZ王国有N个城市,编号从1到N。其中,城市1为HZ王国的首都。这N个城市由N-1条无向道路来连接。虽然只有这么少路,但任意两个城市都可以互相到达。每个城市都有一座标志性的建筑(比如广州塔、东方明珠),站在上面可以看到这座城市有多少条道路与它连接。如果与城市A连接的道路数量等于与城市B连接的道路数...原创 2018-05-02 10:47:09 · 700 阅读 · 1 评论 -
BJ模拟 Period on tree【树状数组+哈希】
题目描述:给定一棵 N 个节点的无根树,每条边上有一个小写英文字母。每次我们选择两个不同的节点 u 和 v,然后依次写下从 u 到 v 的最短路径上每条边上的字母,我们就能得到这条路径对应的字符串。我们称字符串 t 是另一个字符串 s 的循环,当且仅当 s 可由若干份的 t 串拼接而成。 你的任务,则是对于给定的树,处理下面两种操作: • 1 u v,输出从 u 到 v 路径的字符串的...原创 2018-04-25 12:09:20 · 248 阅读 · 0 评论 -
BJ模拟 Problem B: Mr. Panda and Fantastic Beats【广义SAM】
题目描述:给出 nnn 个字符串 S1,S2,...SnS1,S2,...SnS_1,S_2,...S_n,求S1S1S_1中最短的子串满足其不是S2,...,SnS2,...,SnS_2,...,S_n的子串。字符串总长不超过250000。解题思路:将所有串建立广义SAM,维护每个点id的最大值即可判断其是否唯一是 S1S1S_1 的子串,然后贪心找合法串即可。#includ...原创 2018-05-09 19:08:42 · 204 阅读 · 0 评论 -
BJ模拟 相似子串【哈希+并查集】
题目描述:解题思路:把26个字母分开hash,每一位只用0和1表示这一位是否是字母i。 询问时也把26个字母分开比较,把等价类里的hash加起来算。 不同处最多为1,即是最后的hash值只会有一个形如baseibaseibase^i的差,判断一下即可。#include<bits/stdc++.h>#define ll unsigned long long...原创 2018-04-21 21:20:01 · 226 阅读 · 0 评论 -
BJ模拟 Bobo Number【KMP】
题目描述:一个正整数叫作 bobo number 当且仅当它在十进制下可以表示成两个相同的整数(无前导0)拼接而成的结果。例如:12341234和3232都是 bobo number ,但1234321和123401234不是。一个正整数叫作 almost bobo number 当且仅当这个整数在合并连续相同的数位后,其结果为 bobo number 。例如:1112223112233合...原创 2018-05-05 10:32:40 · 428 阅读 · 0 评论 -
BJ模拟 Circle of Stones【KMP】
题目描述:桌子上有 n 个石头围成一个环。每个石头都有一种颜色。每种颜色可以由小写英文字母表示,所以总共有26种颜色。不同的石头可能有相同的颜色。如果每一对相邻的石头都是不同颜色的,则称这 n 个石头构成的环是美丽的。两个石头是相邻的充要条件是这两个石头中间没有其它石头。例如:1号和2号是相邻的,2号和3号是相邻的,……,n号和1号是相邻的。现在,你可以从这 n 个石头中拿走一段连续的...原创 2018-04-28 21:53:46 · 536 阅读 · 1 评论 -
bzoj3676 回文串【回文树】
解题思路:回文树模板题,建好后取每个节点cnt*len的最大值即可。 回文树解析详见:http://blog.csdn.net/u013368721/article/details/42100363 真的好文。#include#define ll long longusing namespace std;int getint(){ int i=0,f=1;char原创 2017-11-23 18:21:08 · 341 阅读 · 0 评论 -
bzoj3926 诸神眷顾的幻想乡【后缀自动机】
解题思路:题目要求的即是在trie树上建立sam后,本质不同的子串个数。 又由于从不同叶子的方向有不一样的串,所以要把以不同叶子为根的20棵tried树合并为一个大tried树来做即可。这里有两种求本质不同的子串个数的方法: 1.每条路径走到每个点都是一个串,所以我们只需要统计出往每个点走之后都有多少串(用f[i]表示)就好了,这种做法要先按max值拓扑排序后反拓扑序计算。 即是f原创 2018-01-28 20:08:26 · 319 阅读 · 0 评论 -
bzoj 1030 文本生成器【AC自动机+dp】
解题思路:题目要求至少含有一个单词的方案数,可以转化成总方案数(26m26^m)减去不含有单词的方案数。 接下来把单词插到AC自动机上进行dp。 f[i][j]表示走到AC自动机的j号结点当前单词长度为i的方案数。 转移就是枚举下一位的26个字母,看是否可行(如果下一位在j的子节点中出现,若被标记为单词的结尾,就不能转移)。#include<iostream>#include<cstdio>原创 2017-11-10 09:46:04 · 301 阅读 · 0 评论 -
bzoj2342 双倍回文【manacher+set】
解题思路:开始以为只用r[i]是4的倍数的位置去检查其两侧是否也是回文就行了,但后面发现是错的,以为所求回文有可能在一个大回文内部,如aaabbaabbaaa;后面看了下题解,还是太天真了。 枚举对称轴x,考虑用len(x,y)*4更新答案,则必须满足y-r[y]<=x,其中y<=x+r[x]/2。 那么我们按照y-r[y]排序后,依次把y插入set,每次询问比x+p[x]/2小的最大值就可以了原创 2017-11-24 09:18:51 · 245 阅读 · 0 评论 -
bzoj2882 工艺【最小表示法】
解题思路:最小表示法模板题。 详解见http://blog.csdn.net/zy691357966/article/details/39854359#include<iostream>#include<cstdio>#include<cstring>#include<string>#include<algorithm>#include<cmath>#include<ctime>#i原创 2017-11-24 10:05:25 · 255 阅读 · 0 评论 -
hdu6096 String【AC自动机】
题目大意:给出一些字符串,给出前缀后缀模式询问,问有多少字符串符合该模式解题思路:之前一直没头绪,看了看dalao的解法,真是奥妙重重。对于每个询问,我们将它变成 后缀+分隔符+前缀 的形式,如询问ab cd变为cd{ab。 对于每个原串,我们也变为 原串+分隔符+原串的形式,如abecd变为abecd{abecd。 这时我们若用询问串匹配原串就刚好只能匹配到题目所要求的一段了。 所以处理后直原创 2017-12-13 10:37:34 · 250 阅读 · 0 评论 -
spoj 8222 substrings 【后缀自动机】
解题思路:建立sam,那么一个节点i所对应的字符串出现次数即为其right集合大小,而其包含字符串长度为(min[i],max[i]),且随着parent链代表字符串长度减小,其出现次数单赠。所以先令f[max[i]]=right[i],最后用f[i]更新f[i-1]即可。#include<iostream>#include<cstdio>#include<cstring>#include<s原创 2017-12-14 09:53:20 · 294 阅读 · 0 评论 -
bzoj3103or3350 Palindromic Equivalence/相似回文串【manacher+并查集+完美消除序列】
解题思路:我们可以先用manacher和并查集处理出哪些位置必须要填相同的字母,再把每个并查集看做一个点,再向和该并查集必须填不同字母的并查集连边,可以证明这样构造出的是一个弦图,详见:http://foreseeable97.logdown.com/posts/194507-herbicidalontak2010palindromic-equivalence然后就成了弦图染色问题了,求一边完美消除原创 2017-12-18 15:00:29 · 447 阅读 · 0 评论 -
hdu4117 GRE Words【AC自动机+动态规划+线段树】
题目大意:给定n个字符串,要求按顺序取一些字符串,满足后一个字符串是前一个字符串的子串,要求使得取出的权值和最大。解题思路:先建出AC自动机,设f[i]f[i]表示选第ii个串做结尾的最大价值,那么有: f[i]=max(f[j])+w[i](ji并且j是i的子串)f[i]=max(f[j])+w[i](j找max(f[j])max(f[j])最朴素的方法就是沿着单词ii的每原创 2018-01-23 19:26:15 · 324 阅读 · 0 评论 -
hdu2243考研路茫茫——单词情结 【AC自动机+动态规划+矩阵快速幂】
这道题就是bzoj1030的翻版,那道题题解见这里。还是用总方案数减去一个单词都不包含的方案数,只不过节点很少,不到30个,就可以用矩阵快速幂优化。不过注意要求的是长度小于L的,所以矩阵多开一维记录前缀和,总方案数也变成了260+261+262+……+26L" role="presentation" style="position: relative;">260+2原创 2018-01-25 22:51:57 · 292 阅读 · 0 评论 -
poj3167 Cow Patterns【KMP】
题目大意:约翰的N(1≤N≤100000)只奶牛中出现了K(1≤K≤25000)只爱惹麻烦的坏蛋。奶牛们按一定的顺序排队的时候,这些坏蛋总会站在一起。为了找出这些坏蛋,约翰让他的奶牛排好队进入牛棚,同时需要你的慧眼来识别坏蛋,为了区分,约翰给所有奶牛都发了号牌,上面写着一个1~S(1≤S≤25)之间的数字。虽然这不是一个完美的方法,但也能起一点作用。现在,约翰已经不记得坏蛋们的具体号码。但是凭原创 2018-01-27 16:13:09 · 267 阅读 · 0 评论 -
poj1743 Musical Theme【后缀数组+二分答案】
题目大意:给n个数组成的串,求是否有多个“相似”且间隔至少为1的子串的长度大于等于5,两个子串相似当且仅当长度相等且每一位的数字差都相等。解题思路:首先把问题转化成重复子串的问题:把原串每一位都与前一位相减。这样得出的新串如果有两个长度为n的子串相同,那么它们对应在原串的长度n+1的子串也就相似。再求出后缀数组。如果只是求可重叠重复最长子串,答案就是height的最大值。但原创 2018-01-28 10:26:18 · 245 阅读 · 0 评论 -
poj3261 Milk Patterns【二分答案+后缀数组】
题目大意:给定一个长度为n的数字串,问可重叠至少出现k次的最长重复子串的长度。解题思路:做法有很多,比如二分+哈希+map(或哈希表)就比较清新,这里说说后缀数组的做法。 建立后缀数组,二分ans后只需看height是否有连续k-1个大于ans即可。#include#include#includeusing namespace std;int getint(){原创 2018-01-28 10:54:33 · 224 阅读 · 0 评论 -
LOJ#6387. 「THUPC2018」绿绿与串串 / String【manacher】
传送门解题思路:签到题。先manacher,一个点如果回文右端点抵到n则合法,或是左端点抵到1且右端点合法。#include<bits/stdc++.h>using namespace std;int getint(){ int i=0,f=1;char c; for(c=getchar();(c!='-')&&(c<'0'|...原创 2018-05-23 19:42:01 · 486 阅读 · 0 评论