F - Failed Failure Link
Editorial
Time Limit: 2 sec / Memory Limit: 2048 MB
配点 : 点
くろうさ「間違い探しもあるよっ!」
問題文
文字列 が文字列 の border であるとは, が の prefix かつ suffix であることとする.長さ の文字列 と整数 に対し, を, の長さ の prefix の border であって,長さが 未満のもののうち最長のものの長さとする (空文字列は任意の文字列の border であるから,これは well-defined である).また, と定める.
しろうさは,長さ の文字列 が与えられたとき を計算するアルゴリズムを実装しようとしたが,間違えてしまった.以下の C++ コード片で表される関数 Xmas
に を引数として与えたときに計算される整数列 g
を とする.
#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
と 個の文字 b
からなる長さ の文字列 に対する,
の最小値,および最小値を達成する を つ求めよ.
制約
- .
入力
入力は以下の形式で標準入力から与えられる.
出力
行目に, の最小値を出力せよ.
行目に,最小値を達成する のうち つを出力せよ.
入力例 1Copy
Copy
2 1
出力例 1Copy
Copy
2 aba
である.
である.