bzoj3277】的更多相关文章

[BZOJ3277]串(后缀自动机) 题面 BZOJ 题解 广义后缀自动机??? 照着别人的打了一遍.. 相当于每个串都构建一个后缀自动机 构建完一个串之后,直接把当前的last指回root就行了??? 好吧,我觉得我看了一个假的广义后缀自动机.. 不过这道题这样就行了 考虑如何计算一个串在多少个母串中出现过? 考虑他的\(right\)集合中有多少个母串的结束位置就好了 那么,每个节点开个\(set\)存一下,然后按照拓扑序向上合并一次 因为\(parent\)包含的母串个数一定较大, 所以,…
因为不会SAM,考虑SA.将所有串连起来并加分隔符,每次考虑计算以某个位置开始的子串有多少个合法. 对此首先二分答案,找到名次数组上的一个区间,那么只需要统计有多少个所给串在该区间内出现就可以了.这是一个主席树的经典问题,对每个数找到上次出现位置扔进去即可.这样就做到O(nlog2n)了. 可以进一步优化到O(nlogn),不是很会. 以及我又不会写SA了,没救. #include<iostream> #include<cstdio> #include<cmath> #…
[BZOJ3473][BZOJ3277]字符串 试题描述 给定 \(n\) 个字符串,询问每个字符串有多少子串(不包括空串)是所有 \(n\) 个字符串中至少 \(k\) 个字符串的子串? 输入 第一行两个整数 \(n\),\(k\). 接下来 \(n\) 行每行一个字符串. 输出 一行 \(n\) 个整数,第 \(i\) 个整数表示第 \(i\) 个字符串的答案. 输入示例 3 1 abc a ab 输出示例 6 1 3 数据规模及约定 对于 \(100\%\) 的数据,\(1 \le n\)…
[BZOJ3277]串 Description 字符串是oi界常考的问题.现在给定你n个字符串,询问每个字符串有多少子串(不包括空串)是所有n个字符串中至少k个字符串的子串(注意包括本身). Input 第一行两个整数n,k. 接下来n行每行一个字符串. Output 输出一行n个整数,第i个整数表示第i个字符串的答案. Sample Input 3 1 abc a ab Sample Output 6 1 3 HINT 对于100%的数据,n,k,l<=100000 题解:需要的用的方法好像有…
BZOJ3473&&BZOJ3277串 题面 自己找去 HINT 对于所有串建立一个广义后缀自动机,对于每一个节点开一个set表示这个节点接受的子串在哪些串里出现过,然后在parent tree上做启发式合并,理论复杂度应该是\(nlog_{n}^2\). 广义后缀自动机 这个广义后缀自动机在建立的时候和后缀自动机时是基本差不多的,就是在每加入一个新串的时候,把\(last=root\)就好了 如何找匹配大等于k次 首先因为每个节点的fa表示的子串都是现在这个节点的后缀,所以fa出现的次数…
[BZOJ3277] 串 Description 现在给定你n个字符串,询问每个字符串有多少子串(不包括空串)是所有n个字符串中至少k个字符串的子串(注意包括本身). Solution 首先将所有串连接起来,预处理出后缀数组和高度数组. 显然直接主席树可以很容易做到 \(O(n \log^2 n)\) .对于每一个后缀的位置,二分一个 LCP 长度,找到这个 LCP 长度对应的区间,检查这个区间是否合法来调节二分边界. 注意在这个做法里,瓶颈不在于主席树,因为主席树的功能完全可以用双指针预处理一…
0.题意:给定你n个字符串,询问每个字符串有多少子串(不包括空串)是所有n个字符串中至少k个字符串的子串(注意包括本身). 1.分析:这个题我问了吴大爷做法 首先建立后缀自动机,然后利用离线搞出每一个节点在多少个串中,这个用树状数组统计一下就好,和BZOJ2780一样,然后如果这个节点在不少于x个串中,我们把这个点的value赋值成这个节点父亲边的字符个数,否则为0.随后我们预处理一下从根到每个节点路径上的权值和.于是每个字符串的答案等于所有这个字符串的后缀节点的从根到该节点的权值和. 然后这个…
题目分析: 用"$"连接后缀数组,然后做一个主席树求区间内不同的数的个数.二分一个前缀长度再在主席树上求不同的数的个数. 代码: #include<bits/stdc++.h> using namespace std; ; ; int m,n,k; string hmk[maxn],str; int sum[maxn]; int sa[maxn],rk[maxn],X[maxn],Y[maxn]; ],Tnum; long long ans[maxn]; struct no…
常见操作:先把所有串都连到一起,但中间加上一个特殊的符号(不能在原串中/出现过)作为分割 由于全部的子串就等于所有后缀的所有前缀,那我们对于每一个后缀,去求一个最长的前缀,来满足这个前缀在至少K个原串中出现过 那我们就二分一下这个前缀的长度.现在的问题就是怎么判断这个前缀是否在K个串中出现过了. 显然,对于一个后缀s的长度为x的前缀,只要某个后缀t 和s的LCP>=x,就说明x也是t的后缀 我们知道,LCP(x,y)=min{height[rank[y]],height[rank[y]-1],.…
题解: 后缀自动机 然后抄了一发题解 可以看看这个博客:http://blog.csdn.net/clover_hxy/article/details/53861268 代码: #include<bits/stdc++.h> using namespace std; ; typedef long long ll; ],fa[N]; int size[N],l[N],nxt[N],a[N],now,pd[N],mark[N],v[N],pos[N]; int point[N],next[N],v…