题意:
给出一个字符串 s (全为小写字母,长度为 n )。有一个光标在任意两个字符之间(不能出现在第一个字符之前和最后一个字符之后)。
有三种操作,代价均为 1 :
- 将光标向左移一位(不能出现在第一个字符之前)。
- 将光标向右移一位(不能出现在最后一个字符之后)。
- 若有两对相同的字符对,光标便可从一个字符对之间移动到另一个字符对之间。
有 m 组询问。每组询问给出两个整数 f 和 t ,求光标从 f 移动到 t 的最小代价。
思路:
首先朴素建图是显然的,把每个空隙当作一个点,互相可达的点就连边权为 1 的边即可。但是这样边的数量是 n^2 级别的,无法通过。
注意到,小写字母对的种类数是很少的。可以通过建立虚点来优化处理第三种操作。
对于每个权值 x,将其和所有权值为 x 的间隙连边。这样如果两个间隙 i,j 的颜色均为 x,它们就可以通过 i→x→j 的路线联通。但这些边的边权要设成 1/2 于是把 i 与 i+1 之间的边拆成两条这样图中所有边的边权相等。
但是这样建完图后跑 floyd 显然还是超时。可以注意到,只要不是只走第一种边,就必然经过至少一个虚点。因此分别以各虚点为起点,跑 26^2 次单源最短路就可以了。而只走第一种边的情况下,答案是显然的。

被折叠的 条评论
为什么被折叠?



