首页 > 其他分享 >abc343G 题解

abc343G 题解

时间:2024-03-04 18:22:21浏览次数:27  
标签:匹配 int 题解 leq 母串 字符串 abc343G hashy

题意

给你 \(N\) 个由小写字母组成的字符串 \(S_1, S_2, \ldots, S_N\),找出一个母串使得它包含所有这些字符串作为它的子串,最小化该母串的长度并输出。

\(1 \leq N \leq 20\),\(\sum |S_i| \leq 2 \times 10 ^ 5\)

(没错洛谷翻译就是我写的)

思路

首先如果有一个字符串被另一个字符串完全包括,那么直接把被包括的字符串删了显然是不影响答案的。

对于剩下的字符串,直接把所有字符串拼接在一起形成母串肯定可行,但假如我们有两个字符串,前一个字符串的后缀和后一个的字符串前缀有一段匹配,那么将后一个字符串的这段前缀删去再加入显然也是合法的母串,所以我们可以贪心删最长匹配。

image

image

我们设 \(l_i\) 为第 \(i\) 为 \(S_i\) 的长度,\(d(i, j)\) 为第 \(j\) 个字符串拼接在第 \(i\) 个字符串后面时最少需要额外追加的字符数量,按照刚才的思路 \(d(i, j)\) 就等于 \(l_j\) 减去 \(S_i\) 的后缀与 \(S_j\) 的前缀的最长匹配。那么该如何计算这个最长匹配呢?当然可以使用 exkmp。对于每对 \((i, j)\),因为最长匹配长度 \(\leq \min(l_i, l_j)\),所以直接枚举最长匹配可能的取值再用哈希判断复杂度就对了,\(O(n^2 + n \sum l_i)\)。

现在问题就被转换成了如果 \(S_i\) 成为母串开头的字符串,那么母串会增加 \(l_i\) 长度。如果 \(S_j\) 要接在 \(S_i\) 后面,母串最少会增加 \(d(i, j)\) 长度。还是问你母串最短能是多少。

那直接把每个字符串看成一个点,\(d(i, j)\) 看成 \(i\) --> \(j\) 的一条边的边权,从第 \(i\) 个点出发初始有 \(l_i\) 的代价,那么经过所有点恰好一次的通路的最小代价就是母串的最短长度。不难发现实际上就是经典的 TSP 问题,状压 dp 解决之。这部分时间复杂度为 \(O(n^2 \times 2^n)\),所以总复杂度就是 \(O(n^2 + n \sum l_i + n^2 \times 2^n)\),5 秒非常宽松,

标签:匹配,int,题解,leq,母串,字符串,abc343G,hashy
From: https://www.cnblogs.com/SkyWave20100601/p/18052371

相关文章

  • P10220 [省选联考 2024] 迷宫守卫 题解
    说一下自己赛时做法。赛时会了,但没能调出来,几乎确定进不去队了,留下这篇题解作为这次比赛的记录吧。称激活守卫为打开开关。首先考虑,如果确定所有开关的情况,Bob有一个简单的贪心做法:当走到一个点时,递归其左右子树并得到两个序列,若右子树的对应序列的小于左子树的对应序列,则右边......
  • 2024年3月3号题解
    225.用队列实现栈解题思路push操作是直接把元素放入队列里面pop操作时把队列头的元素放入到队列尾,重复队列元素个数减一次top操作就是pop加push操作代码实现typedefstruct{intq[1001];intl;intr;}MyStack;MyStack*myStackCreate(){MyS......
  • CF1312C Adding Powers 题解
    题意:对于一个初始全\(0\)的序列,问是否能够进行若干次操作(第\(i\)次操作为对序列中任意一个元素增加\(k^i\)),使得此序列变为目标数组\(a\)。首先,我们令需要进行操作的序列为\(b\)。我们知道,如果能通过若干次操作将\(b\)变为\(a\),则有以下三种情形:\(a\)中的元素全......
  • P8598 [蓝桥杯 2013 省 AB] 错误票据 题解
    思路考虑将\(id\)从小到大排序,然后从\(2\)下标开始扫描一遍\(id\)数组,若当前的\(id_i-id_{i-1}>1\),则说明当前\(id\)存在断号,输出\(id_i-1\);若当前的\(id_i=id_{i-1}\),则说明当前\(id\)存在重号,输出\(id_i\)。注意断号与重号需要分开计算。#include<b......
  • P9185 [USACO23OPEN] Rotate and Shift B 题解
    首先,我们很容易就能得出一个显而易见的结论:若令原数组为\(order\),\(K\)个活跃位置分别为\(A_1,A_2,...,A_K\),则\[order_{A_1}\toorder_{A_2},order_{A_2}\toorder_{A_3},...,order_{A_K}\toorder_{A_1}\]的操作就等价于将\(order\)数组顺时针旋转\(x\)次,即\[orde......
  • CF1833G Ksyusha and Chinchilla 题解
    首先,若\(n\bmod3\neq0\),则一定无解。考虑\(n\bmod3=0\)的情形:首先肯定是先进行一遍树形dp,求出树上每个节点\(x\)的子树大小\(size_x\)。若当前节点的\(size\)值\(=3\),则说明需要切断当前节点于其父节点的连边,使得其子树成为一个大小为\(3\)的单独连通块。......
  • ABC343 G Compress Strings 题解
    QuestionABC343GCompressStrings给定\(N\)个字符串\(S_1,S_2,\cdots,S_N\)找到一个包含所有这些字符串作为子字符串的最小长度的字符串一个字符串\(S\)包含一个字符串\(T\)作为子字符串是指:如果\(T\)可以通过从\(S\)的开头删除零个或多个字符以及从末尾删除......
  • AT_abc184_f [ABC184F] Programming Contest 题解
    题目传送门前置知识Meetinthemiddle解法非正解当成超大背包来做,暴力枚举每个数是否进行相加。时间复杂度为\(O(2^{n})\)。llp[50],ans=0;voiddfs(llx,lln,llm,llworth){ if(x==n+1) { if(worth<=m) { ans=max(ans,worth); } } else { if(wo......
  • P2532 [AHOI2012] 树屋阶梯 题解
    P2532[AHOI2012]树屋阶梯题解容易发现答案是卡特兰数,那么考虑证明这一点。考虑从左下角到右上角填满格子。利用动态规划的思想,回忆一下某道\(IOI\)的题目[数字三角形],每个格子的方案都只能由其左边或下边转移而来。可以结合图理解一下。好,刚才这个定义显然很符合卡特兰......
  • CF1931G One-Dimensional Puzzle 题解
    CF1931GOne-DimensionalPuzzle题解题意传送门思路考虑一下怎么入手,发现一个拼图只能接一些拼图(废话但是有用),所以我们可以简单地画出一个链接关系的图,\(u\tov\)表示编号为\(u\)的拼图后面能够接编号为\(v\)的拼图。然后我们发现问题转换为:......