首页 > TAG信息列表 > P4070
P4070 [SDOI2016]生成魔咒 - SAM
这是一道板子题,考的是一个状态中不同子串数量为len[i] - len[fa[i]],即集合中最长的后缀减去最短的后缀。 不过这题我遇到的问题在于字符集过于庞大,最后是通过用map去代替ch数组解决。 // // Created by acer on 2021/2/16. // //判断子串,不同子串个数,所有子串字典序第i大,最长Luogu P4070 [SDOI2016]生成魔咒
题意:求本质不同的子串数。 \(SA\) \(SAM+DP\) 答案即为路径条数。 我们设 \(f[u]\) 表示从 \(u\) 出发的路径条数:\(f[u]=1+\sum_{(u,v,ch)} f[v]\) ,其中 \(1\) 代表空串。 最后答案即为 \(f[0]-1\) \(SAM+parent树\) 每个子串只会出现一次,并且每个点的 \(sz\) 即为 \(maxlen[u]-mi【洛谷 P4070】 [SDOI2016]生成魔咒(后缀自动机)
题目链接 建出\(SAM\)后,不同子串个数就是\(\sum len(i)-len(fa(i))\) 因为\(SAM\)在线的,所以每加入一个字符就能直接加上其贡献,于是这道题就没了。 因为\(x\)有点大,所以把\(ch\)改成\(map\)就行。 #include <cstdio> #include <cstring> #include <algorithm> #include <map> usingP4070 [SDOI2016]生成魔咒
题目 P4070 [SDOI2016]生成魔咒 有点水 做法 每次把加上\(np\)这个点新生产的串,直接加上\(np.longest-np.fail.longest\) My complete code #include<map> #include<iostream> #include<algorithm> #include<cstdio> #include<cstring> #include<string> using n