プログラミング

説明

文字列 $S$ と文字列 $T$ との編集距離の遷移の考え方は図の通り。
$ s_i = t_j $ のとき $ ed(S_i, T_j) = ed(S_{i-1}, T_{j-1})$
$ s_i \not= t ...

プログラミング

説明

DFSしながら訪問直後はその頂点を「処理中」としておき、DFSの途中で「処理中」ノードに到達したらサイクルがあったことになる。

WHITE = 0 # 未訪問GRAY = 1 # 処理中BLACK = 2 # 処理完了def ...

プログラミング

説明

DFSしながら帰りがけ順に頂点を記録することでトポロジカルソートする

def dfs(u, graph, visited, order): visited = True for v in graph: if visited: ...

プログラミング

説明

多次元配列を多重ループを回してアクセスするとき多次元配列の定義とループを回す順番を合わせないと遅くなる件。
何度もやらかしてそのたびに反省しているのだが、ついついうっかりしてしまうので戒めのために記事にしておく

ar ...

プログラミング

説明

Kahnのアルゴリズムでトポロジカルソートする
参考

def solve(n,m,graph): ''' ABC223-Dでの使用例 n: 頂点数 graph: 普通の隣接リスト ''' in_deg = # 各頂 ...

プログラミング

説明

ある順列が与えられたとき、辞書順でその順列の前後を求める

def next_permutation(p): ''' 1. 末尾から降順になっている最長の部分列を探す⇒ p_last とする 2. p_lastの長さがlen( ...

プログラミング

説明

セグメント木

class SegTree: def __init__(self, n, operator=max, identity=-INFTY): ''' 1-indexedのセグメント木用配列を用意 operator, ...

プログラミング

説明

準備に $O(A\log \log A)$ かかるが、素因数分解は $ O(\log A)$ で可能な方法
参考:

class Osa_k_Method: ''' osa_k法で高速に素因数分解する(O(log(nm ...

プログラミング

説明

マンハッタン距離で $D$ 移動することは $ z = x + y $、$ w = x – y $ として $ z = \pm D $ または、$ w = \pm D $ 移動することに等しい
マンハッタン距離 ...

プログラミング

説明

フェルマーの小定理を使った逆元の計算方法

xinv = pow(x, MOD-2, MOD)# 逆元を求めるには x と MOD は互いに素である必要がある。