【51nod】2606 Secondary Substring】的更多相关文章

51nod 2606 Secondary Substring 感觉有趣的一道计数,实际上不难 感觉好久没用这种技巧了,导致我还在错误的道路上想了好久... 观察题目性质,可以发现就是左边第一次出现两遍的数字的位置\([i,n]\)是一个合法的次级子串 右边第一次出现两遍的数字的位置\([1,j]\)是一个合法的次级子串,两边取max 且最长次级子串一定和首尾相连,至少出现两遍的子序列一定是次级子串的最后一个字符出现两遍和它的前\(|s| - 1\)个字符构成的 这道题就是用至多长度为\(n\)的…
[SPOJ]Longest Common Substring II (后缀自动机) 题面 Vjudge 题意:求若干个串的最长公共子串 题解 对于某一个串构建\(SAM\) 每个串依次进行匹配 同时记录\(f[i]\)表示走到了\(i\)节点 能够匹配上的最长公共子串的长度 当然,每个串的\(f[i]\)可以更新\(f[i.parent]\) 所以需要拓扑排序 对于每个串求出每个节点的最长匹配 然后对他们取\(min\),表示某个节点大家都能匹配的最长长度 最后对于所有点的值都取个\(max\)…
[SPOJ]Longest Common Substring(后缀自动机) 题面 Vjudge 题意:求两个串的最长公共子串 题解 \(SA\)的做法很简单 不再赘述 对于一个串构建\(SAM\) 另外一个串在\(SAM\)上不断匹配 最后计算答案就好了 匹配方法: 如果\(trans(s,c)\)存在 直接沿着\(trans\)走就行,同时\(cnt++\) 否则沿着\(parent\)往上跳 如果存在\(trans(now,c),cnt=now.longest+1\) 否则,如果不存在可行的…
[SPOJ]Longest Common Substring II 多个字符串求最长公共子串 还是将一个子串建SAM,其他字符串全部跑一边,记录每个点的最大贡献 由于是所有串,要对每个点每个字符串跑完后去最小值才是每个点的最终贡献 #include<iostream> #include<cstdio> #include<cstdlib> #include<cstring> #include<cmath> #include<algorithm…
[SPOJ]Longest Common Substring 求两个字符串的最长公共子串 对一个串建好后缀自动机然后暴力跑一下 废话 讲一下怎么跑吧 从第一个字符开始遍历,遍历不到了再沿着\(parents\)走看能否找到出路,走到某个点时,统计一下走过了多少点然后更新答案 来说说这样做的正确性: 遍历是肯定的, SAM 从根节点出发的任意路径都表示一个子串 沿着\(parents\)边往后走,保证贪心情况下维护最长公共子串寻找出路 注意这里是统计走过了多少点更新答案,不能直接通过\(len\)…
[51nod]1602 矩阵方程的解 这个行向量显然就是莫比乌斯函数啦,好蠢的隐藏方法= = 然后我们尝试二分,二分的话要求一个这个东西 \(H(n) = \sum_{i = 1}^{n} \mu(i) == d\) 当然\(\mu(x)\)由于一些很好的性质,这个东西可以用分类讨论做出来 众所周知,求\(\mu\)不为0的数的方法就是容斥求无平方因子数 \(G(n) = \sum_{i = 1}^{\sqrt{N}} \mu(i) \lfloor \frac{N}{i^{2}} \rfloor…
[51nod]1634 刚体图 给一个左边n个点右边m个点二分图求合法的连通图个数,每条边选了之后会带来价值乘2的贡献 类似城市规划那道题的计数 设\(g[i][j]\)为左边\(i\)个点,右边\(j\)个点的图有多少个(就是边随便连) \(f[i][j]\)为左边\(i\)个点右边\(j\)个点的连通图有多少个 然后枚举和左边第一个点连通的联通块是几个左边点,几个右边点 答案可以认为是 \(f[i][j] = g[i][j] - \sum_{k = 0}^{i - 1}\sum_{h = 0…
[51nod]1407 与与与与 设\(f(x)\) 为\(A_{i} \& x == x\)的\(A_{i}\)的个数 设\(g(x)\)为\(x\)里1的个数 \(\sum_{i = 0}^{2^{20}} (-1)^{g(x)}2^{f(x)}\) \(f(x)\)就是按位取反之后的一个FMT卷积,把判断条件改成这一位不存在即可 也可以用FWT的与卷积直接卷起来 #include <bits/stdc++.h> #define fi first #define se second…
[51nod]1776 路径计数 我们先把前两种数给排好,排好之后会有\(a + b + 1\)个空隙可以填数,我们计算有\(k\)个空隙两端都是相同字母的方案数 可以用枚举把第二种数分成几段插进去来算,设这个方案数为\(f[k]\) 然后对于一种有\(k\)个空隙的方案数,枚举剩下的\(a + b + 1 - k\)个空隙填了\(h\)个 然后计算把\(C\)和\(D\)分成\(k + h\)段的方案数就好了,记为\(g[k + h]\) 那么如何计算\(g[i]\)呢 一段要么是偶数,\(C…
[51nod] 2622 围绕着我们的圆环 kcz出的一道比赛题 第一次写带修改的线性基 ps:我觉得我计数计的好麻烦 首先是这个可以认为第二个矩阵是\(q\)个\(s\)位数,如果这\(q\)个数的线性基可以消掉\(C\)中每一行,那么答案就应该是,设线性基个数是\(x\),则应该是\(2^{q - x}\)随便选,然后剩下的用线性基消掉即可,所以系数是\(2^{p(q - x)}\)(因为第一个矩阵有\(p\)行) 那么问题就来了,我们要统计以下两个东西 1.\(q\)个\(s\)位数组成\…