随笔分类 -  字符串--KMP与匹配

摘要:"传送门" 首先这个题目显然就是先求出所有的 $border$,问题转化成一个可行性背包的问题 一个方法就是同余类最短路,裸跑 $30$ 分,加优化 $50$ 分 首先有个性质 $border$ 分成的等差数列的个数不超过 $log$ 和回文树的性质的证明类似~~瞎画图一下就行了~~ 我们注意到可以 阅读全文
posted @ 2019-01-15 09:23 Cyhlnj 阅读(385) 评论(1) 推荐(1)
摘要:"传送门" 每次操作可以把两个字符串中所有同一种字符变成另外一种 定义两个长度相等的字符串之间的距离为:使两个字符串相等所需要操作的次数的最小值 求 $s$ 中每一个长度为 $|t|$ 的连续子串与 $t$ 的距离 字符集为小写字母 $'a'$ 到 $'f'$ Sol 考虑如何计算两个等长串的距离 阅读全文
posted @ 2018-12-13 16:57 Cyhlnj 阅读(238) 评论(0) 推荐(0)
摘要:"传送门" Sol 自己还是太 $naive$ 了,上来就构造多项式和通配符直接匹配,然后遇到 $border$ 相交的时候就 $gg$ 了 ~~神仙的游戏蒟蒻还是玩不来~~ 一个小小的性质: 存在长度为 $len$ 的 $border$ 的充要条件是 $\forall i,s_i=s_{n len 阅读全文
posted @ 2018-12-01 22:44 Cyhlnj 阅读(253) 评论(0) 推荐(0)
摘要:题面 "没有权限号的我当然选择luogu" Sol 假设没有通配符 那么把$T$翻转 设$f[i]=\sum_{j+k=i}[S[k]==T[j]]$ 如果$f[i]$为$0$则$i$之前的一一匹配 那么可以给每个字符一个权值 重新定义$f[i]=\sum_{j+k=i}(S[k] T[j])^2$ 阅读全文
posted @ 2018-04-13 15:39 Cyhlnj 阅读(140) 评论(0) 推荐(0)
摘要:题意 有两个基因串$S$和$T$,他们只包含$AGCT$四种字符。 现在你要找出$T$在$S$中出现了几次。 有一个门限值$k≥0$ 只要$T[i]$和$S[j k]$到$S[j+k]$有相同的,就视为匹配 $(1≤|T|≤|S|≤200000, 0≤k≤200000)$ Sol 套路 这类字符串的 阅读全文
posted @ 2018-04-13 14:28 Cyhlnj 阅读(115) 评论(0) 推荐(0)
摘要:题面 "传送门" Sol 设$f[i][j]$表示到第$i$个数,最后$j$个为不吉利数字的前缀的方案数 于是就可以写一个$KMP$套暴力$DP$跳$next$转移 cpp include define RG register define IL inline define Fill(a, b) m 阅读全文
posted @ 2018-01-19 17:36 Cyhlnj 阅读(122) 评论(0) 推荐(0)
摘要:题面 "传送门" Sol 这是一道阅读理解题,读了好久才明白意思。。。 首先可以想到处理出next数组,每次的位置i跳next跳到长度小于i的一半位置,然后继续跳到零统计此时跳的次数就是答案 那么暴力就是$O(n^2)$ 让我们一起膜拜yyb大佬的 "倍增跳next" 那么优化就是在求next的时候 阅读全文
posted @ 2018-01-18 14:09 Cyhlnj 阅读(147) 评论(0) 推荐(0)
摘要:KMP暴力求出next数组后 实际上是一个最短路问题,floyed搞一搞 然而会TLE 矩阵优化一下即可(倍增floyed) KMP在弱数据下可以AC。。正解请看其他人博客 # include <stdio.h> # include <stdlib.h> # include <iostream> # 阅读全文
posted @ 2017-12-12 19:31 Cyhlnj 阅读(340) 评论(0) 推荐(0)
摘要:题意 三个字符串,找一个字符串(它的子串含有以上三个字符串)使它的长度最短,输出此字符串的长度。 题解 先枚举字符串排列,直接KMP两两匹配,拼接即可。。。答案取最小值。。 常数巨大的丑陋代码 # include <stdio.h> # include <stdlib.h> # include <i 阅读全文
posted @ 2017-07-24 21:28 Cyhlnj 阅读(146) 评论(0) 推荐(0)