其他分享
首页 > 其他分享> > [luogu6396] 要有光 题解

[luogu6396] 要有光 题解

作者:互联网

你谷 link

可以先给一份形式化题意:

给定一个初始串 \(S_0\) 和参数 \(m\),你可以进行一下 \(5\) 种操作:

  1. 对于一个串 \(S\),构造串 \(T\) 满足 \(T\) 为 \(S\) 的最长回文后缀,并将 \(S\) 赋值为 \(T\),代价为 \(A\)。
  2. 对于一个回文串 \(S\),构造串 \(T\) 满足 \(S\) 为 \(T\) 的最长回文后缀且 \(T\) 为 \(S_0\) 的子串,并将 \(S\) 赋值为 \(T\),代价为 \(B\)。
  3. 对于一个回文串 \(S\),构造串 \(T\) 满足可以找到一个长度至多为 \(m\) 的串 \(a\),使得 \(S=a+T+a^R\),并将 \(S\) 赋值为 \(T\),代价为 \(C\),其中 \(a^R\) 表示 \(a\) 的反串。
  4. 对于一个回文串 \(S\),构造串 \(T\) 满足可以找到一个串 \(a\),使得 \(T=a+S+a^R\) 且 \(T\) 为 \(S_0\) 的子串,并将 \(S\) 赋值为 \(T\),代价为 \(D\)。
  5. 对于一个串 \(S\),构造串 \(T\) 满足可以找到一个字符 \(a\),使得 \(T=a+S\) 且 \(T\) 为 \(S_0\) 的子串,并将 \(S\) 赋值为 \(T\),代价为 \(E\),特别的,进行过 \(5\) 操作后不能再进行其他操作。

每次给定一组 \(l,r\),令 \(T\) 为 \(S_0\) 的 \([l,r]\) 范围内的字符取出形成的新串,询问最少需要多少代价能使 \(S_0\) 变为 \(T\)。

首先发现 \(5\) 操作独立于其他操作之外,其它四个操作都基于初始串的回文子串,这提示我们使用一种数据结构维护 \(S_0\) 的所有回文子串,很明显可以想到回文自动机。

先将 \(S_0\) 建成回文自动机,现在我们思考五个操作在回文自动机上对应的意义。

首先就像上文所说的,\(5\) 操作独立于别的操作之外,大概也可以想象是怎么用的,就是在生成目标串的回文后缀以后在前面直接接上,那么我们就考虑别的操作在回文自动机上的意义了。

首先看到最长回文后缀应该能很自然地想到回文自动机的失配指针,\(1\) 操作对应边 \(\langle p,\mathrm{fail}_p\rangle\),\(2\) 操作对应 \(\langle\mathrm{fail}_p,p\rangle\),然后另外两个操作其实也很明显,在串左右两边同时操作正好对应回文自动机的转移边,因为 \(m\) 很小,所以直接对应向父亲暴力连边最多也没几条,但是其中最棘手的

标签:子串,题解,要有光,赋值,操作,自动机,代价,luogu6396,回文
来源: https://www.cnblogs.com/LaoMang-no-blog/p/16445964.html