chokudaiさんのツイートより。簡単な方針を思いつけなかった……
「文字を囲む正方形」の一辺の長さが常にの倍数になることを利用する。黒マスが与えられたとき、を基点に黒マスだけを8方向にたどるBFSをして、連結成分の上下左右の境界を突き止める。とすると拡大率が倍とわかるので、領域を左上を基準に倍に縮小する。
各点に対して上の処理を行うと、図上の文字はすべて等倍になる。あとは、図上のすべてのの正方形について、文字方向 パターンのいずれかに一致するか調べればよい。これは例えばローリングハッシュなどでできる。1 計算量は。
連結成分のサイズだけ見ればよいかもというのは最初に考えたけれど、倍数では文字を1つに絞れないと思ってすぐに捨ててしまった。(実際には、文字を倍に拡大すると連結成分のサイズが倍になるので、異なる文字のサイズが重なることはない。)
プログラミングコンテストチャレンジブック 第2版, pp.333-335より。でも、よく考えると等倍に戻したタイミングで愚直にパターンマッチすれば十分だった。 ↩︎