广义SAM】的更多相关文章

str2int Problem Description In this problem, you are given several strings that contain only digits from '0' to '9', inclusive.An example is shown below.101123The set S of strings is consists of the N strings given in the input file, and all the poss…
3926: [Zjoi2015]诸神眷顾的幻想乡 Time Limit: 10 Sec  Memory Limit: 512 MBSubmit: 974  Solved: 573 Description 幽香是全幻想乡里最受人欢迎的萌妹子,这天,是幽香的2600岁生日,无数幽香的粉丝到了幽香家门前的太阳花田上来为幽香庆祝生日. 粉丝们非常热情,自发组织表演了一系列节目给幽香看.幽香当然也非常高兴啦.  这时幽香发现了一件非常有趣的事情,太阳花田有n块空地.在过去,幽香为了方便,在这n块空地之间修…
3473: 字符串 Description 给定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% 的数据,1<=n,k<=10^5,所有字符串总长不超过10^5,字符串只包含小写字母. [分析] 这道题用后缀数…
首先,让每一个叶节点做一次树根的话,每个路径一定至少有一次会变成直上直下的 于是对于每个叶节点作为根产生的20个trie树,把它们建到同一个广义SAM里 建法是对每个trie dfs去建,last就是父亲的那个节点:每次做一个新trie时,last给成root 然后答案就是每个节点表示的长度和 #include<bits/stdc++.h> #define pa pair<int,int> #define CLR(a,x) memset(a,x,sizeof(a)) #define…
题意 链接 Sol \(10^5\)次询问每次询问\(10^5\)个区间..这种题第一感觉就是根号/数据分治的模型. \(K\)是个定值这个很关键. 考虑\(K\)比较小的情况,可以直接暴力建SAM,\(n^2\)枚举\(w\)的子串算出现次数.询问用个\(n^2\)的vector记录一下每次在vector里二分就好. \(K\)比较大的情况我没想到什么好的做法,网上的做法复杂度也不是很好.. 然后写了个广义SAM + 暴力跳parent就过了.. 不过这题思想还是很好的 #include<bi…
题目链接 \(Click\) \(Here\) 设一个串\(s\)在\(A\)中出现\(cnt[s][1]\)次,在\(B\)中出现\(cnt[s][2]\)次,我们要求的就是: \[\sum cnt[s][1]*cnt[s][2]\] 在\(SAM\)这种把多个串用一个点表示的东西里,答案就变成了这个 \[\sum cnt[s][1] * cnt[s][2] * (len[fa[s]]-len[s])\] 其中的\(cnt\)求法,听说好像可以两个串隔开求?但是我不太会.学了一下用广义\(SA…
传送门 朴素想法:对\(M\)个匹配串\(T_1,...,T_M\)建立广义SAM,对于每一次询问,找到这个SAM上\(S[pl...pr]\)对应的状态,然后计算出对于每一个\(i \in [l,r]\),计算出\(T_i\)能够转移到这个状态的次数然后取\(max\). 需要解决两个问题: 1.如何快速找到\(S[pl...pr]\)在SAM上对应的状态. 因为题目没有给\(\sum pr - pl\)的条件,所以不能暴力,考虑一个一个字符加进去,每加入一个字符计算对应答案.将询问按照\(p…
传送门 先将所有模板串扔进广义SAM.发现作文的\(L0\)具有单调性,即\(L0\)更小不会影响答案,所以二分答案. 假设当前二分的值为\(mid\),将当前的作文放到广义SAM上匹配. 设对于第\(1-i\)个字符来说,最少的失配字符数为\(dp_i\),那么\(dp_i = dp_{i-1} + 1\),且如果当前匹配长度\(len \geq mid\),还有转移\(dp_i = \min\limits_{j=i-len}^{i-mid} dp_j\).发现在\(i\)增大的过程中\(i-…
传送门 树上的任意一条路径一定会在以某一个叶子节点为根的树上成为一条直上直下的链,而总共只有\(20\)个叶子节点. 于是每一次选所有叶子节点中的一个作为根,形成一个\(Trie\),把\(20\)个\(Trie\)统一到一个\(Trie\)上,然后对这个总的\(Trie\)建立广义后缀自动机,最后统计一下广义SAM每个节点代表的字符串个数求和. 在\(Trie\)上BFS建立广义SAM可以做到\(O(20NA)\)的复杂度,把\(20\)个\(Trie\)直接一个个插入SAM在线建会多一个\(…
题意:给出n(n<=10000)个字符串S[1~n],每个S[i]有权值val[i],随机等概率造一个由小写字母构成的字符串T,Sum = 所有含有子串T的S[i]的val[i]之积,求Sum的期望值. 题解:建一个广义sam,对于每次插入的点,我们需要更新val一遍,向suffix link也就是fa数组往前跳即可,需要打个标记,对于同一个串插入时,每个点只更新一次 数组开小了wa到死= = //#pragma GCC optimize(2) //#pragma GCC optimize(3)…