[ABC264G] String Fair Solution

更好的阅读体验戳此进入

题面

给定 n 条评分规则,每条存在字符串 Ti 和得分 Pi。你需要构造一个任意长度但非空的字符串 S,在 S 中每次出现 Ti 就会获得 Pi 得分。你需要最大化得分,输出最大值。若无限大则输出 Infinity

Solution

一个十分精妙的图论。

关键的信息在 |Ti|3,这样的话我们就可以考虑进行建边。我们令 Pstr 表示字符串为 str 的时候的得分,如果没有该字符串的评分规则即为 0

于是考虑如对于从 ab 通过 c 可以有一条边到 bc,边权即为 Pabc+Pbc+Pc。同时注意一些细节,如从空字符串可以通过任意字符,如通过 a 连结到 a,边权即为 Pa,以及对于长度为 1 的字符串连结到长度为 2 的同理。

这样将图建完之后不难发现只需要 SPFA 跑一遍单源最长路,取最大的 dis 即可,如果存在正环那么显然无限大。

于是点数为 n=262+26+1,边数即为 m=26n,于是 SPFA 最坏复杂度即为 O(nm),也就是 265 的级别,可以通过。

当然这里我们用 map 实现,手动实现一个 hash() 之后用 unorderer_map 即可去掉 maplog

Code

UPD

update-2023_01_03 初稿