CF1860E Fast Travel Text Editor

题意:

给出一个字符串 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 次单源最短路就可以了。而只走第一种边的情况下,答案是显然的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值