题解:AT_abc377_g [ABC377G] Edit to Match
退役前最后一篇题解了。
题目中匹配的意思就是相等。也就是说,我们对于当前的字符串 \(s_k\),操作等价于删除它的一个后缀并且补上一个新后缀。
那我们不妨枚举该字符串保留的前缀,对于每个前缀找到在只保留该前缀的情况下至少需要添加多长的后缀才能满足要求。
不难想到,我们对于当前所有的候选前缀,都求出来该前缀至少还需要添加多少个字符才能成为 \(s_1\sim s_{k-1}\) 中的一个。这一点我们可以对于所有候选字符串,把他们每一个前缀都以该前缀为第一关键字,保留该前缀后所需要添加的字符为第二个关键字插到一个 unordered_map
容器里,对于该容器中的每一个第一个关键字,对第二关键字进行比较保留最小值。这样我们就可以快速求出每个前缀所需要添加的最少字符数,加上保留该前缀所需要删除的字符数就是该前缀的答案。最后对于每一个前缀的答案取 min
即可。
使用 string
类型作为 unordered_map
容器的第一关键字会超时,所以我们需要对字符串进行哈希处理,用 unsigned long long
类作为第一关键字,可以通过本题。