摘要: 一道神仙题,考察选手对KMP的深入理解。 先考虑没有2操作的做法。设每一段为一个二元组(x,c),考虑一段前缀匹配后缀,除了第一段的字符,其他段的二元组(x,c)必须相等,所以可以将其视为特殊字符进行匹配。在串末尾加入(x,c)时,显然不断跳next数组,如果当前前缀后接的字符为c ,那么可以增加一 阅读全文
posted @ 2019-05-02 10:01 hfctf0210 阅读(348) 评论(0) 推荐(0) 编辑
摘要: 什么垃圾比赛,A题说的什么鬼楞是没看懂。就我只会BD(其实C是个大水题二分),垃圾游戏,技不如人,肝败吓疯,告辞,口胡了E就睡觉了。 B 很容易发现,存在一种方案,使得相同字母连在一起,然后发现,当字母出现种类数大于等于4时,可以奇偶性相间地连接,然后讨论种类数<=3的:种类数为1,显然直接输出;种 阅读全文
posted @ 2019-05-01 23:49 hfctf0210 阅读(221) 评论(0) 推荐(0) 编辑
摘要: 30分的O(m^2)做法应该比较容易想到:令f[i][j]表示i->j是否有解,然后把每个路径点数不超过2的有解状态(u,v)加入队列,然后弹出队列时,两点分别向两边搜索边,发现颜色一样时,再修改答案,加入队列即可。 100分是挺难想的,是个思维题,可以把边分成连接同色和异色两种。发现走过的路径一定 阅读全文
posted @ 2019-05-01 20:49 hfctf0210 阅读(265) 评论(0) 推荐(0) 编辑
摘要: 看到数据范围n<=1000,但感觉用O(n^2)不现实,所以考虑方向应该是O(n^2logn)。 一种暴力做法:用vector存到1点相同的2点和到2点相同的1点,然后枚举A,枚举BC,再枚举D,然后枚举EF,O(n^4),但复杂度远远不满(符合条件的太少,而且也卡不掉),所以可以获得40pts的好 阅读全文
posted @ 2019-04-30 22:37 hfctf0210 阅读(329) 评论(0) 推荐(0) 编辑
摘要: 题解:首先根据题意,可以猜到结论:最终图一定是从n号点向其他所有点各连一条边。然后发现一个结论:每次把图中一条(a,b)边连成(c,n)。然后50pts的劣质O(mnlogn)的分治做法就有了:对于分治区间[l,r],可以枚举从n号点是否有在(l,r)间的剖边,如果有则直接分治,如果没有,则找到能转 阅读全文
posted @ 2019-04-30 19:00 hfctf0210 阅读(195) 评论(0) 推荐(0) 编辑
摘要: A 容易发现i,i+1至少有一个数出现,于是可以让尽量多的2和奇数出现 #include<bits/stdc++.h> using namespace std; int n,s1,s2; int main() { scanf("%d",&n); for(int i=1,x;i<=n;i++) { s 阅读全文
posted @ 2019-04-30 13:47 hfctf0210 阅读(287) 评论(0) 推荐(0) 编辑
摘要: 看到这题,首先想到将求和转期望,即每次操作进行概率为1/2,求节点打标记概率。 首先对于每次区间修改操作,对节点进行分类: 1、这个点和其父亲都和修改区间无交,这种情况可以无视。 2、这个点和修改区间无交但父亲和修改区间有交,这样该区间有无标记只和本身及是否存在一个祖先有标记相关。 3、这个点被修改 阅读全文
posted @ 2019-04-29 17:20 hfctf0210 阅读(166) 评论(0) 推荐(0) 编辑
摘要: 题意:n*m的矩阵内值有正有负,找一个四连通的简单环(长度>=4),使得环上值的和最大。 题解:看到2<=m<=6和简单环,很容易想到插头DP,设f[i][j][k]表示轮廓线为第i行第j列,插头状态为k的最大满意度。然后又成了一道插头DP的板子题。注意左插头为左括号,上插头为右括号,其余位置无插头 阅读全文
posted @ 2019-04-27 22:13 hfctf0210 阅读(165) 评论(0) 推荐(0) 编辑
摘要: 对插头DP的理解还不是很透彻。 先说一下肤浅的理解吧。 插头DP使用范围:指数级复杂度,且适用于解决网格图连通性问题,如哈密顿回路等问题。插头一般指每相邻2个网格的接口。 题目难度:一般不可做。 使用三进制状态,用0表示没有插头,1表示左括号插头,2表示右括号插头,而由于位运算常数特别小,可以采用四 阅读全文
posted @ 2019-04-25 22:45 hfctf0210 阅读(227) 评论(0) 推荐(1) 编辑
摘要: A 签到 #include<bits/stdc++.h> using namespace std; int n,m,s[2],t[2],ans; int main() { scanf("%d%d",&n,&m); for(int i=1,x;i<=n;i++)scanf("%d",&x),s[x&1 阅读全文
posted @ 2019-04-25 08:22 hfctf0210 阅读(213) 评论(0) 推荐(0) 编辑