この記事は traP 2026 夏のブログリレー 15 日目の記事です。明日の記事は @Oxojo さんの予定です。
この記事には ARC194E Swap 0^X and 1^Y のネタバレが存在します。
文字列に連結演算を入れた構造は、モノイドの公理以外の関係式を持たないことから free monoid と呼ばれています。ここに一部の文字間での可換性を課した構造は free partially commutative monoid あるいは trace monoid と呼ばれ、並列計算におけるジョブ同士の関係を表現できることからコンピュータサイエンス方面でも研究されているらしいです。
「一部の文字ペアについて、その 2 文字での隣接 swap が禁止されている。このとき隣接 swap を繰り返して文字列 から文字列 に変換できるか?」という問題の判定法を提示することを目標とし、trace monoid の性質をざっくりと紹介していきます。
この記事は Trace monoid (en-Wikipedia) を参考にして作成されました。有名な本・記事とは異なる表記をしている可能性があることに注意してください。
定義
- 以下において "swap" は文字列上で隣接した文字を入れ替える操作を指します。
- をアルファベットとします。種類数を と書くことにします。
- を文字列全体の集合とします。特に空文字列を含みます。
- dependency relation
- 対称的かつ反射的である必要があります。
- swap が禁止されたペアの集合です。同じ文字同士は swap 禁止とします。
- independency relation
- の性質から、 は対称的かつ非反射的になります。
- swap が可能なペアの集合です。
- trace
- 文字列 から swap を何回か行って文字列 に変換できるときに と書きます。
- 正確には で定義される二項関係 の反射推移閉包で定まる同値関係です。
- trace monoid
- この記事では使わないので、分からなくても大丈夫です。
- は well-defined なので商集合にも連結演算が入ります。
簡約律 (Cancellation Property)
文字列に対し、文字 として一番右に現れる位置を最右 と呼ぶことにします。
文字 を含む文字列 について、最右 を削除して得られる文字列を と書きます[1]。
右簡約律 が成立することを示します。
(証明)
から に変換する過程を と置く。また、文字列 を最右 で分割して と置く。過程 について
- 操作に最右 が関わらないときは かつ
- 関わるときは
であるから が成立する。 より示された。
左簡約律 (最左削除) も同様にして示せます。系として、文字列 に対し が成立します。
射影による trace 判定 (Projection Lemma)
文字集合 に対し、文字列 から に含まれる文字だけを残してできる文字列を と書きます。これは への射影と呼ばれます。
任意の swap 禁止ペア について、swap の前後で への射影が不変量になることは簡単に分かります。逆に変換可能かどうかは、禁止ペアへの射影が全て一致しているかを見ればよいというのが、以下の Projection Lemma[2] です。
証明 1
を文字列長に関する数学的帰納法で示します。
(証明1)
仮定より であるから、文字 が現れる回数は で等しく、特に である。
文字列長 のとき明らかに成立する。 のときを考える。
文字列 の末尾文字を と置く。仮定から の最右 を末尾まで swap させることが可能であると分かるので である。
文字列長 の Projection Lemma を仮定すると、 に適用することにより が得られて、文字列長 の Projection Lemma が示される。以上の議論に数学的帰納法を用いればよい。
文字列長の和を と置きます。射影ごとに文字列を走査するナイーブな方法で で計算できます。文字ごとの出現位置リストから計算したり、一回の走査で並行して射影を構築したりすることで になります。
後者の方法について、射影を Rolling Hash で表現させると面白い気がします。モノイドが載るデータ構造を利用して部分文字列を調べたり、文字列の累乗が計算できるので例えば かどうか判定したりすることができます。ここにお好みの Rolling Hash に関する典型を追加してください。おまけに空間計算量が落ちます。
証明 2
他の証明も載せます。アルファベット に全順序が定まっているとき、文字列 から変換可能な辞書順最小の文字列 を構築できます。これを標準形 (すなわち同値類の代表元) とすることで trace 判定ができます。
射影は元の文字列のインデックスに関する情報を持たないため dependency graph (en-Wikipedia) というものを経由して Projection Lemma を証明します。
(証明2)
文字列 に対し、 としてグラフ を定義する。このグラフは DAG である。
のトポロジカル順序を受け取り、その順番で文字を並べてできる文字列を返す写像は単射である。また、この写像の像は から変換可能な文字列全体の集合である。よって、文字 を重みとする辞書順最小のトポロジカル順序により生成される文字列が求める文字列 である。
が次の条件を満たすとき dependency graph と呼ぶ。
- グラフ は DAG である。
- ならば頂点 間にいずれかの向きの辺が張られている。
また、dependency graph の同型性は次のような全単射 が存在するかで定義される。
- グラフ は によって同型である。
- 任意の頂点 に対して
Projection Lemma の仮定を満たすとき、作られる dependency graph は同型を除いて一意であり、関数 の値を求めるアルゴリズムは dependency graph の同型性に関して不変なので が導ける。
グラフの辺は定義通り張る必要はなく、射影において隣接する頂点に張ればよいです。計算量は です。
ARC194E
ARC194E Swap 0^X and 1^Y / 公式解説
正整数 および長さ の 01 文字列 が与えられる。 の部分文字列 を に置き換えたり、その逆ができるとき、 を に一致させることは可能か判定せよ。
公式解説の前半の言い換えは同様に行います。
の塊を表す文字 を導入してアルファベット とします。現れる の塊を貪欲に に置き換えるようにして 01 文字列を 文字列に変換したのち、 でのみ swap 可能としてもよいです。あとは かどうかの判定をするだけです。
公式解説の後半はアルファベットに あるいは という順序を入れ、射影から辞書順最小の文字列が一意に定まることを ad-hoc に証明しています。 は swap 禁止ペアなのでどちらの順序を選んでもよいです。
この性質が一般の場合で成り立つという話でした。以上。
あとがき
Gemini に上の問題を投げたら面白そうな話題を返してくれたので、少し勉強して記事にしてみました。よく見返したら Projection Lemma の証明に簡約律を使っていないことに気付いたのですが、消すのも勿体ないので残すことにしました。
trace monoid には面白い話が残っていそうなので、誰か書いてください、頼みました……
この記事は traP 2026 夏のブログリレー 15 日目の記事です。ぜひリンクから他の記事も閲覧してみてください。明日の記事は @Oxojo さんの予定です。
参考にした Wikipedia の記事では文字 を含まない文字列についても定義されていたが、ここでは未定義とする。 ↩︎
Mathematics Stack Exchange の回答において Projection Lemma と呼ばれているが、一般的に何と呼ばれるかは調べていない。 ↩︎