传送门 后缀自动机基础题. 题意简述:支持动态在串尾插入字符,查询在串中出现超过kkk次的子串的个数. 动态修改samsamsam,每次增量构造好了之后在parentparentparent树上从新建的npnpnp到根节点上没有超过kkk次的状态全部更新一遍统计答案就行. 因为从npnpnp到根的出现次数是单调递增的,因此只要当前节点出现次数不少于kkk次就不用继续更新了. 代码: #include<bits/stdc++.h> #define ri register int using na…
传送门 后缀自动机基础题. 求长度为iii的子串出现次数的最大值. 对原串建出samsamsam,然后用sizsizsiz更新每个maxlenmaxlenmaxlen的答案. 然后由于后缀链接将其转化成了一种树形结构,因此直接在上面树形递推即可. 代码 #include<bits/stdc++.h> #define ri register int using namespace std; const int N=5e5+5; int n; char s[N]; struct SAM{ int…
传送门 跟这道题是一模一样的. 于是本蒟蒻又写了一遍10min1A庆祝 代码: #include<bits/stdc++.h> #define ri register int using namespace std; const int N=2e5+5; typedef long long ll; int T,k; string s[N]; struct SAM{ int last,tot,len[N],son[N][26],link[N],val[N]; vector<int>e…
传送门 调代码调的我怀疑人生. 启发式合并用迭代写怎么都跑不过(雾 换成了dfsdfsdfs版本的终于过了233. 题意简述:求给出nnn个字串,对于每个给定的字串求出其有多少个字串在至少kkk个剩下字串中出现过. 显然先对所有字串建一个samsamsam出来,然后对于每个状态用一个setsetset维护在哪些字串里面出现过(这个显然需要在建完parentparentparent树之后启发式合并一波),最后拿每个串在上面匹配,如果当前的状态不满足题意就沿着树边向上跳即可. 代码: #includ…
时间:2018.12.15地点:北京朝阳悠唐皇冠假日酒店…
传送门 后缀自动机基础题. 求第kkk小的子串(有可能要求本质不同) 直接建出samsamsam,然后给每个状态赋值之后在上面贪心选最小的(过程可以类比主席树/平衡树的查询操作)即可. 代码: #include<bits/stdc++.h> #define ri register int using namespace std; const int N=1e6+5; int n,t,k; char s[N]; struct SAM{ int len[N],link[N],son[N][26],…
传送门 后缀自动机基础题. 给两个字符串,让你求长度不小于kkk的公共子串的数量. 这题可以用后缀自动机解决废话 考虑对其中一个字串建出后缀自动机,然后用另一个在上面跑,注意到如果一个状态有贡献的话,从它到根的状态都会有贡献,因此我们给每个节点打一个懒标记最后再统计一次答案即可. 代码: #include<iostream> #include<cstdio> #include<cstring> #include<algorithm> #define ri r…
传送门 后缀自动机基础题. 给出10个串求最长公共子串. 我们对其中一个建一个samsamsam,然后用剩下九个去更新范围即可. 代码: #include<bits/stdc++.h> #define ri register int using namespace std; const int N=2e5+5; int T=0,n; char s[N]; struct SAM{ int rt,tot,last,len[N],lz[N],cnt[N],rk[N],val[N],link[N],s…
传送门 对原串建立一个后缀自动机,然后用反串在上面匹配. 如果当前匹配的区间[l,r][l,r][l,r]包裹了当前状态的endposendposendpos中的最大值,那么[l,maxpos][l,maxpos][l,maxpos]就是一个回文串. 于是赶快码一波统计答案(很遗憾会wa) 因为有可能原串在答案中. 于是我们可以遍历其linklinklink链一直跳来更新答案. 代码: #include<bits/stdc++.h> #define ri register int using…
传送门 后缀自动机模板题. 题意简述:求两个字串的最长公共子串长度. 对其中一个构建后缀自动机,用另外一个在上面跑即可. 代码: #include<bits/stdc++.h> #define ri register int using namespace std; const int N=5e5+5; int n; char s[N]; struct SAM{ int tot,last,rt,len[N],son[N][26],link[N]; SAM(){tot=last=rt=1,len…