F - Failed Failure Link Editorial

Time Limit: 2 sec / Memory Limit: 2048 MB

配点 : 100100

くろうさ「間違い探しもあるよっ!」

問題文

文字列 tt が文字列 ssborder であるとは,ttss の prefix かつ suffix であることとする.長さ nn の文字列 ss と整数 1kn1 \le k \le n に対し,f(s,k)f(s, k) を,ss の長さ kk の prefix の border であって,長さが kk 未満のもののうち最長のものの長さとする (空文字列は任意の文字列の border であるから,これは well-defined である).また,f(s,0)=1f(s, 0) = -1 と定める.

しろうさは,長さ nn の文字列 ss が与えられたとき f(s,0),f(s,1),,f(s,n)f(s, 0), f(s, 1), \ldots, f(s, n) を計算するアルゴリズムを実装しようとしたが,間違えてしまった.以下の C++ コード片で表される関数 Xmasss を引数として与えたときに計算される整数列 g(g(s,0),g(s,1),,g(s,n))(g(s, 0), g(s, 1), \ldots, g(s, n)) とする.

#include <string>
#include <vector>
std::vector<int> Xmas(std::string s) {
  int n = s.size();
  std::vector<int> g(n + 1);
  int j = g[0] = -1;
  for (int i = 0; i < n; ++i) {
    for (; j >= 0 && s[j] == s[i]; j = g[j]) {}
    g[i + 1] = ++j;
  }
  return g;
}

正整数 A,BA, B が与えられる.AA 個の文字 aBB 個の文字 b からなる長さ A+BA + B の文字列 ss に対する, k=0A+Bf(s,k)g(s,k)\displaystyle\sum_{k=0}^{A+B} \bigl\lvert f(s, k) - g(s, k) \bigr\rvert の最小値,および最小値を達成する ss11 つ求めよ.

制約

  • 1A,B1051 \le A, B \le 10^5

入力

入力は以下の形式で標準入力から与えられる.

AA BB

出力

11 行目に,k=0A+Bf(s,k)g(s,k)\displaystyle\sum_{k=0}^{A+B} \bigl\lvert f(s, k) - g(s, k) \bigr\rvert の最小値を出力せよ.

22 行目に,最小値を達成する ss のうち 11 つを出力せよ.


入力例 1Copy

Copy
2 1

出力例 1Copy

Copy
2
aba

f(aba,0)=1,f(aba,1)=0,f(aba,2)=0,f(aba,3)=1f(\mathtt{aba}, 0) = -1,\, f(\mathtt{aba}, 1) = 0,\, f(\mathtt{aba}, 2) = 0,\, f(\mathtt{aba}, 3) = 1 である.

g(aba,0)=1,g(aba,1)=0,g(aba,2)=1,g(aba,3)=2g(\mathtt{aba}, 0) = -1,\, g(\mathtt{aba}, 1) = 0,\, g(\mathtt{aba}, 2) = 1,\, g(\mathtt{aba}, 3) = 2 である.



2025-04-14 (Mon)
14:48:24 +00:00