随笔分类 -  数据结构

摘要:将每个单轮的SG函数抑或可得最终结果。 为了计算SG函数,先对主串用后缀自动机处理,对输入的每个子串,先在自动机上走到对应串的节点,然后枚举后续状态,这些状态即为SG函数对应的后继状态,求SG函数,并将结果保存,否则会超时。 阅读全文
posted @ 2018-08-11 12:07 vwirtveurit 阅读(479) 评论(0) 推荐(0) 编辑
摘要://http://www.cnblogs.com/IMGavin/ //http://hihocoder.com/problemset/problem/1455 //https://media.hihocoder.com/contests/challenge25/solution.pdf //bitset 莫队 dfs序 /* in1[]表示当前处理的子树的bitset状态,in2[]为in1... 阅读全文
posted @ 2017-01-12 19:50 vwirtveurit 阅读(186) 评论(0) 推荐(0) 编辑
摘要:题意:将匹配的串用‘*’代替 tips: 1 注意内存的使用,据说g++中指针占8字节,c++4字节,所以用g++交会MLE 2 注意这种例子, 12abcdbcabc 故失败指针要一直往下走,否则会丢弃一些串 3 当出现非英文字符时应先将指针指向根节点,否则出现 11cyc,,,,,,,y 时结果 阅读全文
posted @ 2016-11-05 20:49 vwirtveurit 阅读(251) 评论(0) 推荐(0) 编辑
摘要:反向操作,先求出最终状态,再反向操作。 然后就是Treap 的合并,求第K大值。 已经释放了内存,但在VS中使用_CrtDumpMemoryLeaks()函数检查还是有内存泄漏问题,原因还没弄清楚 阅读全文
posted @ 2016-10-17 13:20 vwirtveurit 阅读(264) 评论(0) 推荐(0) 编辑
摘要:平方分割一直TLE,最后用归并树处理过了,使用STL会比较慢。 阅读全文
posted @ 2016-10-11 19:38 vwirtveurit 阅读(264) 评论(0) 推荐(0) 编辑
摘要:分析: 给定n个二元组,求选出两个二元组(可以是同一个)组成一序列其LIS为1,2,3,4的方法数。 分别记为s1, s2, s3, s4 s1,s4对应的情形为a >= b >= c >= d, a < b < c < d,易求 长度为3时,先求得s3 + s4的值,分解为两种情况的和减去两种情况 阅读全文
posted @ 2016-09-21 22:04 vwirtveurit 阅读(260) 评论(0) 推荐(0) 编辑
摘要:曾写过迭代加深搜索的方法,现在使用在AC自动上跑最短路的方法 dp[i][j]表示状态为到节点i,模式串是否包含的状态为j的最短串的长度,则状态转移方程为: dp[nx][ny] = min(dp[x][y] + 1) , 其中nx为x后继结点,ny为从y转移过来的新状态,更新时加入队列 阅读全文
posted @ 2016-08-28 19:26 vwirtveurit 阅读(267) 评论(0) 推荐(0) 编辑
摘要:dp[i][j]表示行走i步到达j的最大值,dps[i][j]表示对应的串 状态转移方程如下: dp[i][chi[j][k]] = min(dp[i - 1][j] + sum[chi[j][k]]) 阅读全文
posted @ 2016-08-27 16:44 vwirtveurit 阅读(309) 评论(0) 推荐(0) 编辑
摘要:给定N个长度不超过20的模式串,再给定一个长度为M的目标串S,求在目标串S上最少改变多少字符,可以使得它不包含任何的模式串 建立Trie图,求得每个节点是否是不可被包含的串,然后进行DP dp[i][j]表示在Trie图上行走i步到达节点j的要修改的最小次数,则 dp[i + 1][chi[j][k 阅读全文
posted @ 2016-08-26 16:52 vwirtveurit 阅读(297) 评论(0) 推荐(0) 编辑
摘要:先使用AC自动机求得状态转移关系,再建立矩阵,mat[i][j]表示一步可从i到j且i,j节点均非终止字符的方案数,则此矩阵的n次方表示n步从i,到j的方法数。 阅读全文
posted @ 2016-08-26 11:24 vwirtveurit 阅读(222) 评论(0) 推荐(0) 编辑
摘要:注意添加到集合中的数是升序的,先将数据读入,再离散化。 sum[rt][i]表示此节点的区域位置对5取模为i的数的和,删除一个数则右边的数循环左移一位,添加一个数则右边数循环右移一位,相当于循环左移4位,线段树与树状数组结合,树状数组确定位置。 le[rt]表示左移的位数,区间更新懒惰标记 为什么我 阅读全文
posted @ 2016-08-24 14:07 vwirtveurit 阅读(419) 评论(0) 推荐(0) 编辑
摘要:树状数组,一个想法是当往p注水时,认为是其容量变小了,更新时二分枚举,注意一些优化。 阅读全文
posted @ 2016-08-13 22:27 vwirtveurit 阅读(267) 评论(0) 推荐(0) 编辑
摘要:先记录以1为根时每个节点子树儿子节点的最大与次小值,询问x, y时,先判断x在不在y的子树范围内,若不在,结果为y的儿子结点,后继的最小值。 若x在y的子树范围内,若y儿子最小值是x的前驱,从次小值与父亲节点转移,否则从最小值与父亲节点转移。 阅读全文
posted @ 2016-08-06 22:50 vwirtveurit 阅读(316) 评论(0) 推荐(0) 编辑
摘要:树状数组,与Turing Tree类似。 xr[i]表示从1到i的抑或,树状数组维护从1到i每个数只考虑一次的异或,结果为sum(r) ^ sum(l) ^ xr[r] ^ xr[l] 其中xr[r] ^ xr[l] 相当于l + 1到r出现奇数次的数的异或,sum(r) ^ sum(l)表示l + 阅读全文
posted @ 2016-08-05 10:13 vwirtveurit 阅读(311) 评论(0) 推荐(0) 编辑
摘要:当初合肥区域赛的题(现场赛改了数据范围就暴力过了),可惜当初后缀数组算法的名字都没听过,现在重做下。 i从1到n - 1,每次枚举rank[i]附近的排名,并记录当起点小于i时的LCP(rank[i], d)的最大值,或是在LCP不变时更新起点。 加油吧! fighting!!! 阅读全文
posted @ 2016-08-04 11:06 vwirtveurit 阅读(462) 评论(0) 推荐(0) 编辑
摘要:引用罗穗骞论文中的话: 将n 个字符串连起来,中间用不相同的且没有出现在字符串中的字符隔开,求后缀数组。然后二分答案,用和例3 同样的方法将后缀分成若干组,判断每组的后缀是否出现在不小于k 个的原串中。这个做法的时间复杂度为O(nlogn)。 阅读全文
posted @ 2016-08-03 17:25 vwirtveurit 阅读(241) 评论(0) 推荐(0) 编辑
摘要:引用罗穗骞论文中的话: 先将n 个字符串连起来,中间用不相同的且没有出现在字符串中的字符隔开,求后缀数组。然后二分答案,再将后缀分组。判断的时候,要看是否有一组后缀在每个原来的字符串中至少出现两次,并且在每个原来的字符串中,后缀的起始位置的最大值与最小值之差是否不小于当前答案(判断能否做到不重叠,如 阅读全文
posted @ 2016-08-03 17:17 vwirtveurit 阅读(181) 评论(0) 推荐(0) 编辑
摘要:一共6种情况,a < b且Aa < Ab, c < d 且Ac > Ad,这两种情况数量相乘,再减去a = c, a = d, b = c, b = d这四种情况,使用树状数组维护,le[i]表示i左边比他小的数数量,le1[i]表示i左边比他大的数数量,ri[i]表示i右边比他小的数数量,ri1[ 阅读全文
posted @ 2016-08-03 11:39 vwirtveurit 阅读(364) 评论(0) 推荐(0) 编辑
摘要:借用罗穗骞论文中的讲解: 计算A 的所有后缀和B 的所有后缀之间的最长公共前缀的长度,把最长公共前缀长度不小于k 的部分全部加起来。先将两个字符串连起来,中间用一个没有出现过的字符隔开。按height 值分组后,接下来的工作便是快速的统计每组中后缀之间的最长公共前缀之和。扫描一遍,每遇到一个B 的后 阅读全文
posted @ 2016-08-02 21:40 vwirtveurit 阅读(316) 评论(0) 推荐(0) 编辑
摘要:这题可以用后缀数组,KMP方法做 后缀数组做法开始想不出来,看的题解,方法是枚举串长len的约数k,看lcp(suffix(0), suffix(k))的长度是否为n- k ,若为真则len / k即为结果。 若lcp(suffix(0), suffix(k))的长度为n- k,则将串每k位分成一段 阅读全文
posted @ 2016-08-02 10:16 vwirtveurit 阅读(272) 评论(0) 推荐(0) 编辑