当初合肥区域赛的题(现场赛改了数据范围就暴力过了),可惜当初后缀数组算法的名字都没听过,现在重做下. i从1到n - 1,每次枚举rank[i]附近的排名,并记录当起点小于i时的LCP(rank[i], d)的最大值,或是在LCP不变时更新起点. #include<cstdio> #include<iostream> #include<algorithm> #include<cstring> #include<cstdlib> using nam…
地址:http://acm.split.hdu.edu.cn/showproblem.php?pid=5558 题目: Alice's Classified Message Time Limit: 16000/8000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Others)Total Submission(s): 789    Accepted Submission(s): 311 Problem Description A…
题目链接 http://acm.hdu.edu.cn/showproblem.php?pid=5558 Problem Description Alice wants to send a classified message to Bob. She tries to encrypt the message with her original encryption method. The message is a string S, which consists of Nlowercase let…
容易想到将问题转化为求图的独立数问题 ,但求一般图的独立集是一个NPC问题,需要一些转化. 状态压缩,枚举每个上古农场是否选择,然后将剩下的新农场根据i + j奇偶性分为x , y集. 结果为 max(tot  + nx + ny - 二分图匹配数) #include<cstdio> #include<iostream> #include<cstdlib> #include<cstring> #include<string> #include&l…
http://acm.hdu.edu.cn/showproblem.php?pid=5558 对于每个后缀suffix(i),想要在前面i - 1个suffix中找到一个pos,使得LCP最大.这样做O(n^2) 考虑到对于每一个suffix(i),最长的LCP肯定在和他排名相近的地方取得. 按排名大小顺序枚举位置,按位置维护一个递增的单调栈,对于每一个进栈的元素,要算一算栈内元素和他的LCP最大是多少. 如果不需要输出最小的下标,最大的直接是LCP(suffix(st[top]),  suff…
题意:给定一个长度为n的下标从0开始的小写字母字符串,每次对于当前的i寻找一个j使得后缀i与后缀j的lcp最大,(j<i)若lcp相同则取较小的 若lcp为0则输出0与当前字符,i自增1,否则输出lcp的值与j,i自增lcp的值,以上过程重复直到i>=n 要求模拟这个过程 n<=1e5,sigma n<=2e6 思路:显然后缀的lcp要用到后缀数组 考虑对于每一个i都直接枚举j不可做,对于rank而言可以预处理出每一段连续的height大于0的起始位置和结束位置,在段中往左右两侧暴…
题意: 给定一个长度不超过 10W 的只包含小写字母的字符串,从下标 0 到 n−1.从下标 0 开始操作, 每次对于下标 pos查找下标 pos 开始的子串中最长的在其他地方出现过的长度,其他出现的位置要求起点在位置 pos 之前,然后 pos 移动到这个长度之后继续操作:如果没有这样的最长串儿就直接 pos++,继续操作,直到 pos=n 结束. 对于上述两种操作,前者输出最大长度 K 以及这种串儿最左边出现的位置:后者输出 −1 和 s[pos] 的 ASCII码值. 精炼一下题意:就是求…
题意 大概就是给你一个串,对于每个\(i\),在\([1,i-1]\)中找到一个\(j\),使得\(lcp(i,j)\)最长,若有多个最大\(j\)选最小,求\(j\)和这个\(lcp\)长度 思路 首先我们需要知道对于每个\(i\),能与下标小于\(i\)开头的前缀构成的最大\(lcp\)是多少 这个可以在最外层枚举\(i\)的过程中维护一个\(set\),这样在插入当前的\(rk[i]\)的时候能\(O(logn)\)得到这个最长的\(lcp\) 然后根据这个值二分出\(rk[i]\)向左右…
题目链接 POJ2774 SPOJ1811 LCS - Longest Common Substring 比后缀自动机慢好多(废话→_→). \(Description\) 求两个字符串最长公共子串 \(Solution\) 任何一个子串一定是某个后缀的前缀 可以将两个字符串拼在一起,中间用一个从未出现过的字符隔开,这样ht[]的最大值就是答案? 不一定,最大的ht[]可能是由同一个字符串得到的,判一下属于哪个字符串即可 //3772K 516MS //SPOJ:26M 0.11s(N=5e5)…
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6194 题意:告诉你一个字符串和k , 求这个字符串中有多少不同的子串恰好出现了k 次. 解法:后缀数组.我们先考虑至少出现k 次的子串, 所以我们枚举排好序的后缀i (sa[i]) .然后k段k 段的枚举.假设当前枚举的是 sa[i]~sa[i + k -1],那么假设这一段的最长公共前缀  是L 的话.那么就有L 个不同的子串至少出现了k次.我们要减去至少出现k + 1次的 , 但还要和这个k 段…