摘要:
诸神眷顾的幻想乡 给出一棵树 叶子节点<=20 询问树上一共可能有多少个不同颜色序列 颜色值域<=10 这题有一个结论 从树的所有叶子节点为根开始搜,搜到的从根到节点的路径 包含树上所有叶子的路径 观察到叶子节点的数量<=20 那么就可以以每个叶子节点为根搜索,把搜到的路径 依次插入同一颗字典树内 阅读全文
摘要:
研究了下概念,就学会了基于字典树的广义SAM构造方法。 北大带哥提出的别的高效构造完全不会了... SAM是基于字符串的,GSAM就是把lst换成字典树的上一个节点就行了。 #include<bits/stdc++.h> using namespace std; const int maxn=3e6 阅读全文
摘要:
首先对每个位置处理出它作为右端点的最长子序列zz[i] 这个问题是老题 然后,每次区间询问就是求 max(i-max(l,i-zz[i]+1)+1) 这里注意到,i-zz[i]+1这玩意好像是单调不减的? 尝试证一下... 那么可以二分区间内第一个i-zz[i]+1大于l的位置p p前面半段的答案稳 阅读全文
摘要:
对于t=0的情况: 在不同位置出现的子串算同一个子串,这里巨大的坑点是要把后缀自动机上除起点以外的所有点的sz置为1(不管它是虚拟节点还是真实节点),这一点萌新还没理解... 然后把所有节点按照len值从小到大排序,然后做一个倒着的转移,每个节点首先能转移出sz个子串,然后加上它后继节点的贡献,可以 阅读全文
摘要:
给出一个序列,每次询问区间内出现次数恰好是k的元素个数。 //c[maxn]维护出现i次的数有多少 //cc[maxn]维护第i个数出现多少次 //然后莫队 #include<bits/stdc++.h> using namespace std; const int maxn=4e4+100; in 阅读全文
摘要:
给出一个字符串。 请你找出所有出现次数恰好为k次的子串中,出现次数最多的子串长度。 先建出后缀自动机。 每个节点所代表的子串长度区间为len[link[i]]+1到len[i]。 每个节点所代表的子串出现次数是它的link树子树大小, 用差分数组维护一下。 //一个子串的出现次数= //它的link 阅读全文
摘要:
支持在一个字符串后面在线添加一个字符,同时每次询问当前字符串的本质不同子串数量。 后缀自动机好像有一个性质,就是在线添加字符的时候并不会影响link树的形态,只是在link树上新增一个节点?刚开始一知半解... #include<bits/stdc++.h> using namespace std; 阅读全文
摘要:
建出link树后,每个节点的len[i]-len[link[i]]就是它所代表的不同子串数量。 #include<bits/stdc++.h> using namespace std; const int maxn=4e6+10; int len[maxn],link[maxn],nxt[maxn] 阅读全文