字符串算法
文章平均质量分 62
issue是fw
19 years old, struggling in life, chasing daydreams.
展开
-
A. chino with string(ac自动机+floyd矩阵快速幂)
LINK有mmm个字符串,每个字符串有一定的分值(可能为负数)求出一个长nnn的字符串sss使得它的价值最大,你只需要输出这个最大的价值.价值定义为∑i=1mcii∗pointi\sum\limits_{i=1}^m ci_i*point_ii=1∑mcii∗pointi其中ciici_icii表示给定的第iii个字符串在sss中的出现次数,pointipoint_ipointi表示第iii个字符串的分值对mmm个字符串建acacac自动机,每个节点预处理一个mximx_imxi表示原创 2021-07-15 23:15:19 · 530 阅读 · 0 评论 -
P5284 [十二省联考2019]字符串问题(技巧,SAM的前缀和连边)
LINK考虑每个AiA_iAi向AjA_jAj连边,当且仅当存在一个被AiA_iAi支配的串BzB_zBz,使得BzB_zBz为AjA_jAj的前缀这样得到了一个图,只需对这个图拓扑排序求最长路即可.T1T1T1先可以对所有的支配关系由AAA连向BBB,费用为000(此时BBB串相当于一个中转点)那么现在只需要考虑BiB_iBi是哪些AAA串的前缀然后连边可以很容易的知道,在后缀自动机上,父亲是儿子的后缀如果我们对反串建SAMSAMSAM,反串SAMSAMSAM中父亲是儿子的后缀原创 2021-07-15 21:30:43 · 315 阅读 · 0 评论 -
616 F. Expensive Strings(广义SAM上简单dp)
LINK建出广义SAMSAMSAM后,只需要知道经过每个节点的权值和是多少即可也就是对每个节点求出∑ci∗ps,i\sum\limits c_i*p_{s,i}∑ci∗ps,i我们很容易知道一个节点内的字符串共出现过sizusiz_usizu次,sizu=∑pu,isiz_u=\sum p_{u,i}sizu=∑pu,i不过权值cic_ici似乎不同啊…没关系,那就每次插入前缀时,令那个节点的权值加上cic_ici那么这个节点的所有父亲都会有这个收益,最后来一遍树形dpdpdp即可原创 2021-07-14 10:07:38 · 269 阅读 · 0 评论 -
P4022 [CTSC2012]熟悉的文章(广义SAM+决策单调性)
LINK显然L0L_0L0有单调性,从而转化为判定性问题由于需要超过原串长度的90%90\%90%,不妨定义f[i]f[i]f[i]表示前iii个字符形成的最大熟悉字符使用后缀自动机可以预处理一个sufisuf_isufi表示最长可以使[i−sufi+1,i][i-suf_i+1,i][i−sufi+1,i]能匹配上原串先继承上一次的状态f[i]=f[i−1]f[i]=f[i-1]f[i]=f[i−1]若sufi>=L0suf_i>=L_0sufi>=L0令l=i−s原创 2021-07-13 21:17:36 · 199 阅读 · 0 评论 -
The 15th Chinese Northeast L. k-th Smallest Common Substring(广义SAM,对节点字典序排序)
#include <bits/stdc++.h>using namespace std;const int maxn = 4e5+10;int n;char a[maxn];int zi[maxn][30],fa[maxn],l[maxn],id=1,las=1;int vis[maxn],color[maxn],mi[maxn];void insert(int c,int col){ int p = las, np = ++id; las = id; l[np] = l[原创 2021-07-13 15:04:02 · 406 阅读 · 0 评论 -
ZOJ Searching the String(match指针暴力跳fail)
LINK给出一个文本串sss和nnn个模式串问每个模式串fif_ifi在文本串sss中最多出现几次type==0type==0type==0表示可覆盖,type==1type==1type==1表示不可覆盖比如abaabaaba在ababaababaababa中,若可覆盖则出现222次,否则只出现一次type==0type==0type==0的模式串只需要跑一遍acacac自动机即可type==1type==1type==1的模式串,考虑第一次匹配到的时候可以直接让答案加一第二次匹配到的时原创 2021-06-29 20:29:01 · 218 阅读 · 0 评论 -
P4569 [BJWC2011]禁忌(ac自动机+矩阵快速幂)
LINK对于特定的长度为nnn的字符串,容易发现如果[l,r][l,r][l,r]是一个禁忌字符串,那么答案马上可以加一然后单独再对[r+1,n][r+1,n][r+1,n]计算贡献,这样一定最优.于是使用acacac自动机压缩一下nnn个字符串的状态,定义f[i][j]f[i][j]f[i][j]表示前iii个字符匹配到jjj位置的概率每次枚举字母kkk,设状态jjj通过字母kkk可以转移到状态nxtnxtnxt当nxtnxtnxt为终止节点时,设proalp=1alphabetproalp=\原创 2021-06-25 16:22:22 · 234 阅读 · 0 评论 -
牛客多校六Palindrome Mouse(PAM上DAG)
LINK题意给定字符串sss,将sss的所有回文子串放进集合www中从www选出串aaa和串bbb(满足a!=ba!=ba!=b且aaa是bbb的子串)问方案数考虑建立回文树,除了根节点每个节点都代表一个本质不同的回文串设sss为节点uuu表示的回文串sss包含回文树的哪些回文子串呢??我们来分析一下①.若回文子串不以s1s_1s1开头,那么由于回文,也不会以sns_nsn结尾此时删掉两头的字母也没有影响,也就是可以转移到父节点②.若回文子串以s1s_1s1开头,相当于以sns_原创 2021-05-28 21:32:25 · 231 阅读 · 0 评论 -
Problem A. MUV LUV EXTRA(kmp求最小循环节)
LINK最小化a∗p−b∗la*p-b*la∗p−b∗l其中ppp表示循环节总长,lll表示循环节长度若循环节从iii位置开始,那么一定需要延续到末尾考虑固定循环节总长度ppp,也就是需要最小化lll转化一下题意,现在循环节总长是[i,n][i,n][i,n]我们要找到最小的jjj满足[i,j][i,j][i,j]是[i,n][i,n][i,n]的循环节设[i,n][i,n][i,n]可以表示为ssssbssssbssssb的形式其中sss是最小循环节,bbb是sss的前缀,如何找到sss原创 2021-05-19 19:21:25 · 239 阅读 · 0 评论 -
2018-2019 ACM-ICPC南京 M. Mediocre String Problem(SAM+PAM)
LINK题意给定串sss和串ttt要求在sss中找一个子串s′s's′(不需要本质不同),ttt中找一个前缀t′t't′满足s′s's′长度大于t′t't′,使得s′+t′s'+t's′+t′是一个回文串,求方案数好像这题用exkmp+mancherexkmp+mancherexkmp+mancher就是裸题??不过SAMSAMSAM也不难因为s′s's′长度大于等于t′t't′所以s′s's′可以分为两部分,即s′=s1′+s2′s'=s_1'+s_2's′=s1′+s2′其中s原创 2021-05-12 17:17:52 · 455 阅读 · 0 评论 -
牛客多校2018第一场 I Substring (不同子串的个数)
题意给定串sss,只由字母a,b,ca,b,ca,b,c组成现在我们有3!3!3!种方式重新表示a,b,ca,b,ca,b,c的含义比如让字母aaa表示′b′'b'′b′,让字母bbb表示′a′'a'′a′,让字母ccc表示′c′'c'′c′那么子串abcabcabc经过映射后就是bacbacbac现在请你求出,sss中的不同构子串数量。s1,s2s_1,s_2s1,s2串不同构,指的是s1s_1s1在任意映射规则下都无法等于s2s_2s2先3!3!3!枚举字母之间的映射情况,可以得原创 2021-05-02 21:53:59 · 394 阅读 · 0 评论 -
P6793 [SNOI2020] 字符串(SAM树上贪心合并)
LINK每次可以修改一段AAA中单词的后缀,应该和后缀全家桶有点关系,可以先建立SAMSAMSAM看看因为是修改的后缀长度最小,也就是匹配的前缀长度最大而SAMSAMSAM只能处理后缀,所以是对a,ba,ba,b的反串放一起建广义SAMSAMSAM这样和原题意完全等价,只不过从匹配前缀变成匹配后缀,修改后缀变成修改前缀长度为kkk的子串间的匹配可以理解为后缀与后缀之间的匹配我们知道自动机上两个节点的lcslcslcs是他们lcplcplcp节点的最大长度记作sss设节点iii表示rev(a)r原创 2021-04-28 19:31:52 · 308 阅读 · 0 评论 -
gym101237 C. The Palindrome Extraction(SAM+manecher)
LINK给出一个串sss,找出两个不相交的子串a,ba,ba,b(aaa在前bbb在后)满足a+ba+ba+b是一个回文串考虑串∣a∣>=∣b∣|a|>=|b|∣a∣>=∣b∣怎么计算,因为如果∣a∣<∣b∣|a|<|b|∣a∣<∣b∣,只需要对反串也算一遍就好了那么一定是a=b+wa=b+wa=b+w的形式,www是一个回文串我们从回文串下手,枚举每个点iii作为回文中心,最长的回文是[l,r][l,r][l,r]那么让[l,r][l,r][l,r]作为w原创 2021-04-23 20:26:19 · 279 阅读 · 0 评论 -
Gym101194F Mr. Panda and Fantastic Beasts(广义SAM+最短路)
LINK①.标记法直接对nnn个串建立广义SAMSAMSAM如果是第一个串插入产生的节点标记为000,其余串插入的节点标记为111然后由于祖先节点都是自己的后缀,如果自己属于第一个串,那么祖先也是第一个串所以基数排序一遍,把标记传递给祖先节点于是,每个点是否独立属于第一个串我们就知道了。我们从自动机的根节点开始bfsbfsbfs,保存到达每个点的最短路第一个搜到的合法节点(只在第一个串出现),就是我们的答案,途经的转移边就是子串正版广义SAM(特判重复节点版本)#include <原创 2021-04-22 16:08:12 · 262 阅读 · 0 评论 -
2016-2017 ACM-ICPC CHINA-Final F. Mr. Panda and Fantastic Beasts(后缀数组的两种解法)
LINK题意给出nnn个字符串,求只在串111中出现的最短且字典序最小的子串。设第一个串长lenlenlen把nnn个串插入分隔符串起来求后缀数组,设新串总长度为lll枚举iii满足sai<=lensa_i<=lensai<=len,说明saisa_isai这个后缀起始于串111设iii左边第一个不属于串111的后缀为saleftsa_{left}saleft,设iii右边第一个不属于串111的后缀为sarightsa_{right}saright那么求出ans=m原创 2021-04-22 15:02:01 · 337 阅读 · 0 评论 -
CF17E Palisection(链式回文自动机)
LINK发现直接求相交并不好写,考虑求不相交,然后用总的回文串对数减去不相交的对数对于一个回文串对,我们只对左边那个回文串计算贡献那么枚举以点iii结尾的回文串,这个数量可以用回文自动机快速解决而iii之后的回文串数量,可以考虑对反串做一遍回文自动机的后缀和这样就可以轻松求解然而这题卡回文自动机的空间,正解还要用链表模拟,我懒得写了#include <bits/stdc++.h>using namespace std;const int maxn = 2e6+10;const原创 2021-04-12 20:18:51 · 289 阅读 · 0 评论 -
P3181 [HAOI2016]找相同字符(SAM+dfs)
LINK后缀数组说实话不是练习用的话谁tmtmtm用后缀数组啊把两个串拼起来中间加#\##上SASASA所有相同子串的对数,相当于两两来源不同的后缀间的lcplcplcp先考虑求一个字符串两两后缀lcplcplcp之和考虑按顺序加入sa[1],sa[2]...sa[1],sa[2]...sa[1],sa[2]...加入sa[i]sa[i]sa[i]时,和sa[i−1]sa[i-1]sa[i−1]的lcplcplcp是height[i]height[i]height[i]和sa[i−2]sa[原创 2021-04-08 15:12:58 · 242 阅读 · 0 评论 -
SP7258 SUBLEX - Lexicographical Substring Search(本质不同子串字典序第k小)
LINK因为所有本质不同的子串都在从根节点出发的路径上我们建立SAMSAMSAM,利用dfs/tuopudfs/tuopudfs/tuopu都可以求得sumusum_usumu数组sumusum_usumu表示从uuu出发能走多少条不同的路径考虑现在从根节点出发,依次贪心考虑′a′'a'′a′到′z′'z'′z′设通过′a′'a'′a′边转移到vvv当sum[v]>=ksum[v]>=ksum[v]>=k此时显然,走′a′'a'′a′边最多能到sum[v]sum[v]su原创 2021-04-08 14:02:38 · 260 阅读 · 0 评论 -
P3763 [TJOI2017]DNA(SAM+dfs)
LINKSAM写法记得以前是用FFTFFTFFT写的,推狮子翻来覆去…然而这不是被SAMSAMSAM秒掉的垃圾题吗??!!建立SAMSAMSAM,直接从根节点去dfsdfsdfs如果自动机上有边转移就不需要花费,否则花费一次字母不同的机会如果匹配完了串SSS,加上当前节点的出现次数即可LCP写法直接枚举s0s_0s0中的开始位置jjj,判断[j,j+∣S∣−1][j,j+|S|-1][j,j+∣S∣−1]是否满足要求当然不是一位一位匹配,我们直接跳跃相同的部分怎么跳??这个可以二分+哈原创 2021-04-07 20:46:55 · 252 阅读 · 0 评论 -
2020牛客暑期多校训练营(第一场)B-Suffix Array (后缀数组+思维)
LINK题意给出长度为nnn的字符串,现在每个后缀都可以生成一个对应的序列求这nnn个后缀生成的序列按照字典序排序的顺序,从小到大输出。由于只有两个字母a,ba,ba,b,考虑到第一个出现的字母aaa和字母bbb在序列都是数字000所以每个后缀的前缀序列一定是01...1001...1001...10的形式(中间可能没有111),我们称之为AAA部分AAA部分长度越小的,字典序越小(很显然吧,都是01..1001..1001..10的形式嘛)AAA部分长度相同的,就都去掉AAA部分,比较后缀原创 2021-03-28 11:09:47 · 264 阅读 · 0 评论 -
P4770 [NOI2018] 你的名字(SAM上容斥维护endpos)
LINKCase1先考虑一个弱化版本,也就是每次询问区间是l=1&&r=∣S∣l=1\&\&r=|S|l=1&&r=∣S∣怎么求串TTT拥有和SSS不同的本质不同串数量??考虑对TTT的每一个前缀T[1...i]T[1...i]T[1...i]求出一个res[i]res[i]res[i]表示和串SSS的最长公共后缀这个对SSS建一个SAMSAMSAM在上面跑就好了然后∑res[i]\sum\limits res[i]∑res[i]包含了很多重复的子原创 2021-03-25 11:05:31 · 347 阅读 · 0 评论 -
CF666E Forensic Examination(广义SAM+倍增+线段树合并维护区间最大)
LINK题意给出字符串SSS和字符串数组TTT,其中TTT有mmm个字符串qqq个询问,每次问S[pl...pr]S[p_l...p_r]S[pl...pr]在Tl...rT_{l...r}Tl...r的哪个串里的出现次数最多,并输出出现次数多解输出最前面的那个。q,∣S∣<=5∗105q,|S|<=5*10^5q,∣S∣<=5∗105 ,∑i=1m∣Ti∣<=5∗104\sum\limits_{i=1}^m |T_i|<=5*10^4i=1∑m∣Ti∣&l原创 2021-03-24 22:15:03 · 264 阅读 · 0 评论 -
P3346 [ZJOI2015]诸神眷顾的幻想乡(tire树上的广义SAM)
LINK简化一下题目,意思就是需要把所有路径组成的字符串统计有多少本质不同的串。考虑广义SAMSAMSAM,把所有路径串插入进来不久好了吗??然而复杂度爆炸…让我们考虑一下,我们dfsdfsdfs这棵树因为这颗树的路径是很多重复的,比如从根节点到uuu的串插入到SAMSAMSAM上,节点是samusam_usamu这时uuu有两个儿子v1,v2v_1,v_2v1,v2,我们直接在samusam_usamu后面插入这两个儿子即可和广义SAMSAMSAM构造的过程是一样的但是这样,只有原创 2021-03-24 16:40:40 · 270 阅读 · 0 评论 -
CF452E Three strings(广义SAM)
LINK建立广义SAMSAMSAM由于三元组一定是相同长度,所以必定在相同的节点内部所以我们可以枚举每个节点来计算贡献那么对于一个节点来说,对l∈[len[fai],leni]l\in[len[fa_i],len_i]l∈[len[fai],leni]都产生了siz[u][1]∗siz[u][2]∗siz[u][3]siz[u][1]*siz[u][2]*siz[u][3]siz[u][1]∗siz[u][2]∗siz[u][3]的贡献这样就变成统计sizsizsiz的问题了那么有两种写法原创 2021-03-24 13:19:45 · 285 阅读 · 0 评论 -
P4081 [USACO17DEC]Standing Out from the Herd P(广义SAM或后缀数组容斥)
LINK题意给出nnn个串,求每个字符串拥有多少其他字符串没有的子串(重复子串只计算一次)后缀数组。用特殊字符拼接起来,那么每个字符串在SASASA中都是连续的若干段对于每一段[l,r][l,r][l,r]单独求本质不同子串,然后去重只需要减去lcp(l−1,l)+lcp(r,r+1)−lcp(l−1,r+1)lcp(l-1,l)+lcp(r,r+1)-lcp(l-1,r+1)lcp(l−1,l)+lcp(r,r+1)−lcp(l−1,r+1)这个应该很好理解,不过lcp(l−1,r+1)l原创 2021-03-23 14:19:33 · 327 阅读 · 1 评论 -
P4094 [HEOI2016/TJOI2016]字符串(二分+SAM上线段树合并)
LINK题意给定串sss和qqq个询问每次问s[a...b]s[a...b]s[a...b]的所有子串和s[c....d]s[c....d]s[c....d]的最长公共前缀最大值考虑二分答案midmidmid问题转化为,s[c...c+mid−1]s[c...c+mid-1]s[c...c+mid−1]是否在s[a...b]s[a...b]s[a...b]的某个子串中出现过考虑到s[c...c+mid−1]s[c...c+mid-1]s[c...c+mid−1]是前缀,而后缀自动机更擅长处理后原创 2021-03-23 13:38:24 · 247 阅读 · 0 评论 -
1037. H. Security(贪心+后缀自动机上线段树合并)
LINK如果每个操作只要求我们在整个SSS串上找到字典序大于TTT且最小的子串只需要对SSS建立SAMSAMSAM,然后因为所有子串包含在从根节点出发的路劲上我们就一直走和TTT相等的边,直到匹配到长度kkk的时候走不下去了那我们知道需要在第kkk位大于TTT,如果不能的话,看一下第k−1k-1k−1位是否能大于…以此类推但是现在是询问SSS串的[l,r][l,r][l,r]区间,难道我们每次都重新建立SAMSAMSAM吗?显然不可能。我们维护每个节点的所有endposendposendpos!原创 2021-03-23 11:06:14 · 260 阅读 · 0 评论 -
#6071.「2017 山东一轮集训 Day5」字符串(合并n张SAM的DAG)
LINK如果只有一个串,那么建立SAMSAMSAM直接求本质不同的子串个数就好了可以选择利用parentparentparent树性质求,也可以选择在DAG上dpdpdp不同路径的方案数现在有多个串,不好利用SAMSAMSAM的形式:每条路径代表的子串不同(可自动去重)考虑对每个串都建立了一个SAMSAMSAM,每个串都有一个DAG设串AAA有子串a,ab,abc,空,串BBB有子串c,空那么ab+cab+cab+c也是abcabcabc,而abc+空abc+空abc+空也是abcabcabc,原创 2021-03-22 20:16:41 · 386 阅读 · 0 评论 -
CF427D Match &; Catch(广义后缀自动机)
LINK建立广义后缀自动机,然后给每个点染色fff数组代表这个点在串AAA出现多少次,ggg数组代表在串BBB中出现多少次我们对每一次插入的前缀,跳后缀链接累加#include <bits/stdc++.h>using namespace std;const int maxn = 4e4+19;const int N = 1e7+10;char a[maxn];int n,m,f[maxn],g[maxn];int zi[maxn][27],las=1,id=1,ans[ma原创 2021-03-21 17:57:36 · 228 阅读 · 0 评论 -
SP8093 JZPGYZ - Sevenk Love Oimaster(广义SAM维护每个节点的颜色种类)
LINK对nnn个串建立广义SAMSAMSAM,然后我们需要预处理一个siz[i]siz[i]siz[i]数组表示节点iii在多少个串中出现过我们这样做,拿每一个串在SAMSAMSAM上跑那么对于每串iii的一个前缀会跑到SAMSAMSAM上的点ppp可以知道,ppp和ppp的祖先节点,都在串iii出现过,我们就一直暴力跳fafafa染色就好了为了不重复染色,给每个点维护一个最后被染色的是哪个串,如果就是当前串,说明祖先节点都被染过了可以跳出循环#include <bits/stdc+原创 2021-03-21 17:18:55 · 360 阅读 · 0 评论 -
P6139 【模板】广义后缀自动机(广义 SAM)
LINK广义SAMSAMSAM#include <bits/stdc++.h>using namespace std;const int maxn = 2e6+10;int n;char a[maxn];struct Tire{ int id,fa[maxn],col[maxn],zi[maxn][27]; Tire() { id = 1; } inline void insert(char a[] ) { int len = strlen( a+1 ), p = 1原创 2021-03-20 22:08:01 · 314 阅读 · 0 评论 -
CF204E Little Elephant and Strings(后缀数组+尺取,区间max)
LINK题意给出nnn个串,求每个串有多少[l,r][l,r][l,r]的区间使得这段区间在这nnn个串中的至少kkk个串包含。把nnn个串穿起来,中间用不同的字符连接对于串sss如何计算答案…考虑对串sss的每个后缀计算一遍答案相当于固定了左端点lll,要求最大的右端点rrr相当于找到kkk个来自不同字符串的后缀(包括串s的后缀),使得它们的lcplcplcp最大那么串sss的答案加上lcplcplcp于是我们按照sasasa的顺序尺取一些恰好包括kkk个不同串的区间区间最小值lc原创 2021-03-17 10:02:18 · 296 阅读 · 0 评论 -
CF873F Forbidden Indices(SAM)
LINK比模板稍微多了点东西啊…求∣x∣∗f(x)|x|*f(x)∣x∣∗f(x)这个f(x)f(x)f(x)还不能算以禁止位置结尾的次数…其实也非常好办,就是遇到禁止位置插入SAMSAMSAM的时候令siz[np]=0siz[np]=0siz[np]=0也就是不算以这个点结尾,然后就和板子一样了#include <bits/stdc++.h>using namespace std;#define int long longconst int maxn = 3e6+10;c原创 2021-03-17 08:21:10 · 302 阅读 · 0 评论 -
Poj 3415.Common Substrings(后缀自动机匹配)
LINK求两个串长度至少为kkk的相同子串对。对串AAA建立SAMSAMSAM,拿串BBB在串AAA上跑若以iii结尾的BBB子串在SAMSAMSAM上跑到的节点是ppp,此时最大匹配长度是lll若l<kl<kl<k,当然不需要统计答案若l>=kl>=kl>=k那么对于节点ppp包含的子串类来说,有l−max(k,len[fap]+1)+1l-max(k,len[fa_p]+1)+1l−max(k,len[fap]+1)+1个子串满足条件这些子串出现过s原创 2021-03-16 21:34:15 · 264 阅读 · 0 评论 -
2019牛客暑期多校训练营(第四场)I-string(SAM+PAM)
LINK题意我们说串aaa和串bbb不等价是说a!=ba!=ba!=b且a!=rev(b)a!=rev(b)a!=rev(b)其中rev(b)rev(b)rev(b)是bbb的反转串从sss串中选出最多的子串,使得任意两个子串都不等价。原问题相当于,某个子串和它的反串只能计算一次贡献考虑把原串和反串拼起来变成s#rev(s)s\#rev(s)s#rev(s)其中sss是原串,rev(s)rev(s)rev(s)是反串sss的所有本质不同子串在sss中计算过了一遍若某个子串的反串没在sss原创 2021-03-16 19:42:03 · 227 阅读 · 0 评论 -
CF653F Paper task(二分+后缀数组去重)
LINK题意一个长度为nnn的括号串,求有多少本质不同的括号子串括号序列的定义是在任何位置左括号的数量大于等于右括号的数量那么把(((看作111,把)))看作−1-1−1做前缀和preprepre数组枚举左端点lll,那么我们可以二分出一个rrr使得[l,r][l,r][l,r]的区间最小值大于等于pre[l−1]pre[l-1]pre[l−1]因为中间有任何一个pre[i]<pre[l−1]pre[i]<pre[l-1]pre[i]<pre[l−1]都是不合法的,而区间最小原创 2021-03-16 09:57:47 · 276 阅读 · 0 评论 -
SP8093 JZPGYZ - Sevenk Love Oimaster(ac自动机差分fail树)
LINKnnn个模式串,mmm个查询串每次问一个查询串是多少模板串的子串。经典问题了,对mmm个查询串建ac自动机然后把nnn个模式串每个都在ac自动机跑一下,设第iii个模式串经过的点集是kkk那么kkk中每个点跳failfailfail到达的点集并的那些点,答案加一,因为这些点出现了模式串iii暴力是O(n2)O(n^2)O(n2)的我们可以把这kkk个点按照在failfailfail树上的dfsdfsdfs序排序然后这些点在树状数组上答案加一,相邻节点的lcalcalca答案减一那原创 2021-03-15 20:06:20 · 319 阅读 · 0 评论 -
CF802I Fake News (hard后缀数组单调栈)
link求出SASASA数组,考虑这个玩意的变形∑cnt(s,p)2\sum cnt(s,p)^2∑cnt(s,p)2按照sa[1],sa[2]...sa[1],sa[2]...sa[1],sa[2]...的顺序把后缀全部加入,那么所求答案就是ans=∑i=1n∑presai2∗(presai在之前出现的次数和)+1ans=\sum\limits_{i=1}^n \sum\limits_{pre_{sa_i}}2*(pre_{sa_i}在之前出现的次数和)+1ans=i=1∑npresai∑2原创 2021-03-15 19:06:10 · 283 阅读 · 0 评论 -
牛客练习赛57 D.回文串(PAM)
LINK直接建回文树,得到以iii结尾/开始的最大回文串长度然后枚举分割点O(n)O(n)O(n)取maxmaxmax即可比较模板的题#include <bits/stdc++.h>using namespace std;const int maxn = 4e5+10;struct PAM{ int fail[maxn],zi[maxn][27],len[maxn],id,las; int pre[maxn],suf[maxn],qui[maxn];//[1,i]结束 c原创 2021-03-09 21:50:04 · 244 阅读 · 0 评论 -
P6125 [JSOI2009]有趣的游戏(高斯消元+ac自动机)
LINK显然对nnn个玩家的序列建立acacac自动机高斯消元其实这是个无限循环游戏,因为轮次可以是无限的我们直接定义f[i]f[i]f[i]表示最终停在自动机节点iii的概率,下面的pi,jp_{i,j}pi,j表示节点iii到节点jjj的概率显然非终止节点的f[i]=0f[i]=0f[i]=0至于求终止节点的f[i]f[i]f[i],是从若干个非终止节点转移而来的,知道非终止节点的f[j]f[j]f[j]没有意义,无法转移那我们变一下,定义f[i]f[i]f[i]表示经过节点iii的概率原创 2021-03-09 16:32:17 · 292 阅读 · 2 评论