01 2017 档案
摘要:方法:桥 2015 WF的题,很巧妙,看过题解恍然大悟。这道题本质是将一个无向图的边用k种颜色染色,使得对于每一个环,这个环上每种颜色的边,数量相同。首先,我们说一个intuition,如果我们把每个环的长度都求出来并且求gcd,那么这个gcd应该是最大长度的倍数。 code: 1 #include
阅读全文
摘要:方法:最小表示法 题意即求最小表示法,带入模版即可。 code: 1 #include <cstdio> 2 #include <cstring> 3 #include <algorithm> 4 #include <iostream> 5 #include <string> 6 #include
阅读全文
摘要:方法:Manacher Manacher算法在O(length) 时间内求出各个回文子串的长度。O(length) 时间检查时那一种情况。 code: 1 #include <cstdio> 2 #include <cstring> 3 #include <algorithm> 4 #include
阅读全文
摘要:方法:最小表示法 题意及求一个string最小表示法的启示index。套用模版即可。 code: 1 #include <cstdio> 2 #include <cstring> 3 #include <algorithm> 4 #include <iostream> 5 #include <str
阅读全文
摘要:方法:hash 二分 最优化问题转化为判定性问题。先预处理每个string的前缀hash,然后对于每组query,二分答案。当两个prefix 的hash value相同的时候,稳妥的方法是用O(prefix.length())的方法检查这两个prefix是否相同(1.430s); 本题采用 bkd
阅读全文
摘要:方法:AC自动机 先把禁止的string插入ac自动机中,然后再这个自动机上求最长的合法路径。如果出现环或者最长路径长度为0,则输出“No";否则输出最长路径。 code: 1 #include <cstdio> 2 #include <cstring> 3 #include <algorithm>
阅读全文
摘要:方法:Trie 看了题解,有两种做法,大致是相通的。这道题重点在于如何判重。 建立两个trie,取名prefix 和 suffix。把所有string插入第一个trie,每个节点就代表一种prefix。同理,把所有string反转之后插入第二个trie,每个节点就代表一个suffix。如果没有重复的
阅读全文
摘要:方法:Hash 一定要好好读题,原题的要求即让你判断一个string时候有两个长度大于3的回文substring,这两个substring可以相交但是不能包含另一方。 一个很重要的observation是我们只需要找长度为3 或者长度为4的回文substring即可(贪心),可以证明, 找长度更长的
阅读全文
摘要:方法: Trie 其实就是建树,node里存文件名。因为最后同目录下的文件要按照文件名顺序输出,所以储存child pointer的时候用了map,自带排序。下面的code是动态分配内存,然而用数组也可以,参见trie template。 Code: 1 #include <cstdio> 2 #i
阅读全文
摘要:方法:hash 用一个unordered_set 存所有可能的string code: 1 #include <cstdio> 2 #include <cstring> 3 #include <algorithm> 4 #include <iostream> 5 #include <string>
阅读全文
摘要:方法:kmp 其实这道题算是一个字符串匹配,原string 为 str, 把str 反转后得到 rev,看rev在str什么位置可以匹配到,多出的部分不算。匹配的方法有很多种,这道题用kmp比较容易。也可以用suffix array 或者 hash。 kmp code:
阅读全文
摘要:方法:暴力 / kmp 先说一下暴力的方法,就是尝试把原来的string不断分割,在substring 里求解。code 如下 然而看到题解,好像是用kmp,值得学习 http://www.cnblogs.com/jackge/archive/2013/01/05/2846006.html
阅读全文
摘要:方法:Trie 本题其实就是trie的实现,每个节点需要记录两个值,深度 和 visit的次数,答案便是 max(深度 * visit的次数)。 数组实现code: 心血来潮用动态分配空间写了一个,注意要合理释放空间,比如写一个delete(node * root) 的函数,不过注意最好不要写成re
阅读全文
摘要:方法:数论 注意last digit只与m的最后一位和m有关,同时,如果了解number theory 中的multiplicative order 的话,就会发现,1-9 mod 10 的order 不是1 就是4, 所以结果只与m的最后一位和n mod 4的结果有关。而n mod 4 的结果只与
阅读全文
摘要:方法:数论 暴力 一个正整数n的因子个数d(n) 在number theory 是一个multiplicative function,有公式。利用素数筛选先求出 sqrt(1e9)内的素数,然后对范围内每一个数求解d(n), 去最大的即可。 code: 由于范围比较小(1e4), 据说不预处理素数,
阅读全文
摘要:方法:素数筛选 素数筛选法的推广。先求出H-primes, 可以证明得到,任意两个H-prime相乘,结果都是semi-prime H-number。求出范围内所有semi-primes,预处理前缀和即可。 (这里用到一种O(n) 素数筛选的方法) code:
阅读全文
摘要:方法:暴力 设home的序号为n,街尾序号为N,列出方程 (n-1)*n/2 = (N+n+1)*(N-n)/2, 化简得 2*n*n = (N+1)*N。枚举N再检查是否有解。可以直接求,或者打表。 code: 据说可以转化成佩尔方程,待学习。
阅读全文
摘要:方法:对数,暴力 我们需要求出最小的e,是的存在一个i > len(n) , 满足 floor[2^e/ (10^i)]= n, 即 n*10^i < 2^e < (n+1)*10^i。对两边同时取log10 (以10为底的对数,记作lg),得到 lg(n) + i < e*lg(2) < lg(n
阅读全文
摘要:方法:中国剩余定理 列出方程,发现是求解线性模方程,而且三个mod 两两互质,所以用中国剩余定理即可。 注意,最后求具体日期时,我采用了试一试的方法,因为方程组的解 D 和 d 之间的大小关系不确定。 code:
阅读全文
摘要:方法:暴力 数论 其实我们可以先证明一下为什么n(不被2和5整除)的一个倍数可以在十进制下被表示成1111111...111, 即证明存在一个形如1111...111的数可以被n整除。n 不能被2和5整除,可以得出 n 和 10 是 互质的(comprime),那么10 mod n 存在一个mult
阅读全文
摘要:方法: factorial mod, logarithm 求trailing zeros,其实就是factorial mod 的应用, 求长度,利用log 函数。需要注意的是,答案为int(log(n!)/log(b)) + 1, 比如 a = 2, b = 2, 长度为2. code: (我的笨办
阅读全文
摘要:方法:数论 因为n <= factorsum(n) <= 1000, 可以暴力打表,求出所有n <= 1 所对应的factorsum(n), 求的时候甚至不需要O(n^0.5) 来判断因子,O(n) 判断也可以通过。 然而如果factorsum的范围很大该如何求呢。可以推导得出 。那么可以素数筛选预
阅读全文
摘要:方法:数学 整除 根据推导发现新的方阵长为2*x+3*d, 宽为 x+2*d, 面积满足方程 (2*x+3*d)*(x+2*d) = S + 2*x*x。 (d为thickness) (比较合理的方法) 继而得到 x = (S-6*d*d)/(7*d) 枚举d即可。 code: (我的傻方法) 利用
阅读全文
摘要:方法 : 数论? 用k,x/k, x%k表示 ceil 和 floor,观察求解。 code:
阅读全文

浙公网安备 33010602011771号