かんプリンの学習記録

勉強したことについてメモしています. 主に競技プログラミングの問題の解説やってます.

ABC284 F - ABCBAC

問題はこちら

問題概要

長さ{2N}の文字列{T}が与えられる.長さ{N}の文字列{S}であって,{T=S[0,i)+rev(S)+S[i,N)}となるようなものを求めよ.

  • {1\leq N\leq 10^6}

解説

{T[i,j)}で文字列{T}{i}文字目から{j-1}文字目までの文字列とします.
{rev(T)}で文字列{T}を反転させた文字列とします.

すべての{i}で以下の判定が高速に行えればこの問題を解くことができます.

  • {T[0,i)+T[N+i,2N)=rev(T[i,i+N))}か?

例として以下の入力を考えます.

以下のような判定ができればよいです.

必要な操作は

  • 連続部分文字列の取得
  • 文字列の結合
  • 文字列の比較

となりますが,これはローリングハッシュを用いることで前処理{O(N)}のもと,すべて{O(1)}で行うことができます.

qiita.com

提出プログラム

https://atcoder.jp/contests/abc284/submissions/37954573

感想

ロリハやるだけでした