- 博客(20)
- 收藏
- 关注
原创 LCA的倍增算法
LCA即最近公共祖先。百度百科给的定义是,对于有根树T的两个结点u、v,最近公共祖先LCA(T,u,v)表示一个结点x,满足x是u和v的祖先且x的深度尽可能大。在这里,一个节点也可以是它自己的祖先。上面说的深度是将根结点的深度视为最小。加深一下理解,如果u和v的最近公共祖先是x,那从u到v一定要经过x。同时也可以这样理解,以x为根的子树,是包含u和v的最小树,即从原树中取任意一节点为根的子...
2020-01-16 23:02:49
334
原创 洛谷P1967货车运输 最大生成树跑LCA
点我打开题目题目描述:n个点,m条边,边为双向边,每条边有最大载重,q个询问,每个询问包含两个整数a和b,询问一辆货车从a到b可以的最大载重。不保证一定有道路从a到b(保证a!=b)。这个题目只要求最大载重,没有要求路径的距离,所以我们“贪心”的想,货车一定是走极限载重大的路,所以我们需要删掉一部分边,这些边是一定不会走的,但是删边的同时,必须要保证原本互相连通的两个点不会因此而不连通,还...
2020-01-10 13:54:47
176
原创 2019年icpc徐州站L、Loli, Yen-Jen, and a cool problem
传送门广义SAM模版题 记录一下每个点的父亲节点,每个点对应的状态节点,然后跑广义SAM,统计下数量,跳一下fail边就可以了。#include <bits/stdc++.h>using namespace std;const int maxn = 3e5 + 150;const int kind = 26;typedef long long ll;int tot1 = ...
2019-12-08 22:18:01
645
原创 浅谈马拉车
处理字符串问题时。我们经常会碰到处理回文串的情况,马拉车算法是处理回文串问题的一个非常好用的算法。它可以在O(n)时间内处理出一个字符串所有的回文中心(可以是字符也可以是字符之间的空)的最长回文串的长度。首先我们考虑暴力的情况。比如abba,它的回文中心有7个,分别是四个字符和他们中间的三个空。确定回文中心后我们大概要这么处理:假设t为回文中心,len[t]表示以t为回文中心的回文串的回...
2019-12-05 16:39:31
341
原创 浅谈kmp算法
kmp算法学之前我们先明确它是用来干嘛的?KMP算法是一种改进的字符串匹配算法,KMP算法的时间复杂度O(m+n)。首先我们来看一下最暴力最朴素的字符串匹配算法,给出长度为n的主串S1,和长度为m的模式串S2。最暴力方法是从S1这个主串从1到n-m+1这每一个位置截取长度为m的串然后让其都与模式串S2进行匹配。时间复杂度为O(n*m)例如:主串:abacabc模式串:aba我们...
2019-11-28 15:16:27
302
原创 洛谷P4762(PAM)
luoguP4762PAM题目嗷,不会先学。首先暴力的话就是和串的长度是一样的,如果里面含有偶数长度的回文串,那么就可以减少次数,奇数长度的回文串没意义。然后一开始令dp[i]=len[i],然后我们来看如何优化abbaabba这种首先打印ab,然后翻转abba,然后翻转abbaabba。然后其他所有的都暴力加上。。一开始自己枚举所有的状态点,然后暴力跳fail,然后T了。看了题解,发现...
2019-11-09 14:59:54
187
原创 2019牛客多校第六场C(PAM)
传送门不会PAM,建议看一下该博客PAM维护一个数组,表示节点对于答案的贡献那么如何计算这个值呢,首先我们需要知道它是由谁转移而来的,比如该节点表示的是aabbbbaa,他是由abbbba转移而来的,我们在计算aabbbbaa时首先要加上abbbba,然后还有一些fail边连向的点首先我们来看对于aabbbbaa这个节点有贡献的串的个数,abbbba是一个,然后就是对abbbba有贡献,肯定...
2019-11-09 11:33:47
133
原创 洛谷P4555 [国家集训队]最长双回文串(manacher)
洛谷P4555这个题目要求找出一个字符串的子串,该子串由两个回文串构成,求其最大长度,首先我们先跑一遍manacher,这样我们就求出了i的最大回文半径p[i],对于每个位置i我们需要知道以i为结束的最大回文串的长度(l[i]),以及以i为开始的最大回文串的长度(r[i]),在跑manacher的时候,对于一个位置i的跑p[i],我们需要更新(i-p[i]+1,i+p[i]-1)位置的l[i],...
2019-11-08 18:46:15
210
原创 牛客 最长回文
传送门有两个长度均为n的字符串A和B。可以从A中选一个可以为空的子串A[l1…r1],B中选一个可以为空的子串B[l2…r2],满足r1=l2,然后把它们拼起来(A[l1…r1]+B[l2…r2])。求用这样的方法能得到的最长回文串的长度。注意:求的不是本质不同的回文串个数哦!!!对两个串分别跑manacher,然后我们枚举每个中心进行匹配。以枚举A串的中心举例,如果是选择字母做中心,如果字...
2019-11-08 17:45:47
252
原创 hdu6651(贪心)
hdu6651简单贪心。要满足所有策略,所以我们找一种可以让复习失败的最优策略,如果能满足这种,那其他的都满足。最优策略 就是最小的花费使得至少n-k+1个点是失败的。如果这个最小花费小于m那这项策略就不能满足所有的考试分数分配情况。所以我们要保证任意的n-k+1的点的组合的复习时间之和要大于m。所以每个点的最低时间分配不可能小于m/(n-k+1),分值为m/(n-k+1)的点的个数应...
2019-11-04 08:16:26
317
原创 牛客SAM总结
传送门TJOI2015弦论对于一个给定长度为N的字符串,求它的第K小子串是什么。(位置相同和位置不同的贡献不定)利用了计数排序的思想,在统计数量时,为了避免漏掉和增多,在统计时候如果我们计算sum[fa[i]]+=sum[i]sum[fa[i]]+=sum[i]sum[fa[i]]+=sum[i]时,必须保证i已经统计完毕,根据SAM的性质len[fa[i]]小于len[i],所以可以根...
2019-11-02 11:20:12
174
原创 2019牛客多校第十套C(hash)
传送门神仙题目,吹爆kfj。dls用的border的那种写法还没有学会。离线之后hash判周期。border算法 会补的(一定会的)#include<bits/stdc++.h>using namespace std;const int maxn = 1e6 + 50;const int seed = 131;typedef unsigned long long ul...
2019-11-01 19:41:48
152
原创 2019牛客多校第四场I string(SAM PAM)
题目描述:给出一个字符串求该字符串本质不同且不互为反串的子串的数目。abacabac,b,a,ab,aba,bac,ac,cab和ba互为反串只算一个这个题目是SAM+PAM的板子题SAM有两种使用的方法。一:输入原串然后输入一个特殊字符,然后输入原串反串。这种我们在计算时候ans=(sam.sum−1LL∗(len+1)∗(len+1)+p)/2ans=(sam.sum-1...
2019-11-01 19:32:40
195
1
原创 HDU6741秦皇岛CCPC2019MUV LUV UNLIMITED(博弈)
HDU6741题目描述:每次可以拿任意个数的叶子节点。谁取走根节点谁赢。首先一个比较明显的结论就是如果一个叶子节点有兄弟节点的话一定是先手必胜的。(这个节点不影响你取其他节点,且如果其他节点都不能取,你可以取走这个节点)。同时这个也意味着如果参加游戏的某一方通过自己的操作给另外一方填了一个叶子结点,且该叶子节点有兄弟节点,那么就相当于将胜态给了对方。根据这个结论,继续拓展一下。我们建...
2019-11-01 18:56:29
298
原创 HDU6629(扩展kmp)
hdu6629题目描述给你一个字符串然后求从任意位置开始的后缀与原串匹配的最大长度+1的总和好像是扩展kmp的模板题 但是做这个题目的时候没有学过扩展kmp就想了想 然后看数据 应该是需要O(n)处理完的 然后如果纯粹暴力的 其实会有很多无用的匹配 想了想马拉车记录最大匹配和最大匹配对应节点的思想,把它魔改了一下(还是要记录最大匹配节点和最大匹配,但是改了下对应关系),A掉了,具体看代码...
2019-11-01 18:27:57
507
原创 洛谷P4081(SAM fail树上dfs染色)
luogu P4081感觉不到黑题的难度,做完这道题目,对SAM添加字符操作有了更加深刻的理解。题目描述:给你一个整数n,然后给你n个串,要求求出n个串每个的只属于其的本质不同的非空字串的数量。所有串的总长度不超过1e5,n不超过1e5不知道每条串的最大长度,1e5*1e5的数组太大可以用一个1e5的数组存 然后记录下每条串的长度如果想用SAM来做这道题目我们要清楚SAM的工作原理...
2019-11-01 11:26:26
164
原创 HDU6582(最短路+最小割)
Hdu6582思路比较简单,先找最短路,然后跑dinic求最小割,一开始还想再建图,后面看了别人的代码,其实只要把不是最短路径上的路径的权值归零就可以了。#include<bits/stdc++.h>using namespace std;typedef long long ll;const ll inf = 1e17;const int maxn = 2e6+50;in...
2019-10-30 16:15:26
161
原创 HDU6586 String(贪心)
HDU6586简单贪心题目满足要求的字典序最小的子序列优先级1字典序 优先级2位置靠前因为要求是子序列 很容易想到要记录前缀和后缀和等等。h[i][j]表示位置i之后的字符(a+‘j’)的数量pos[i]记录了字符(a+‘i’)的所有位置集合have[i]表示当前已经有字符(‘a’+i)的数量有了这三个 就可以开心的贪心了贪心需要满足的两个条件有:1.当前选择的位置i后面剩余的...
2019-10-30 15:08:16
142
原创 HDU 6583Typewriter(SAM+DP)
hdu6583题目描述:给定一个字符串和两个数字p、q两种操作 打印一个字符花费为p 打印一个已经打印出来的串的子串 花费为q 输出打印给出字符串的最小花费思路:开始以为是贪心 每次能打印子串就打印子串 但是后面发现这种方法是不对的比如下面的例子:aaaaaa8 9贪心的答案 8(a)+8(a)+9(aaaa)+9(aaaaaa)=34正确的答案 8(a)+8(aa)+8(aa...
2019-10-30 14:44:45
236
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人