AOJ-ICPC 2016.10.9

実装軽いやつ


問題

Tree Reconstruction | Aizu Online Judge

問題概要

各連結成分が強連結なグラフが与えられる。
各頂点について、入ってくる辺と出ていく辺の重みが等しくなるようにすると、
一部の辺の重みを隠しても復元することができる。
最大でいくつの辺の重みを隠せるか。

解法

ある頂点の入ってくる辺の重みが全てわかっているとすると、出ていく辺のうち1つを隠すことができる。
全ての頂点について、出ていく辺の1つを隠すと入ってくる辺の重み全てが分かる頂点がなくなるので、ある頂点だけは全ての辺をそのままにしておく。
各連結成分についてこれが言えるので、連結成分ごとに|edge| + |verticle| - 1が答えとなるのでこれを全て足せば良い。

問題

Enumeration | Aizu Online Judge

問題概要

省略

解法

高速メビウス変換。
高速メビウス変換はある集合の全ての部分集合についてandの条件の場合の値が求まっている時、
全ての部分集合についてorの条件の場合の値をO(2^{N})で求めることができる。逆の操作として高速ゼータ変換がある。
この問題は高速メビウス変換するだけなのだが、long long でもオーバーフローするのでいい感じにしてやる必要がある。

問題

Do Geese See God? | Aizu Online Judge

問題概要

文字列Sが与えられる。
文字列Tは以下の条件を満たす。
1.STの部分列である。
2.Tは回文である。
3.Tは1,2を満たす文字列のうち、最短の文字列である。
Tとして考えられ文字列のうち、辞書順でk番目のものを求めよ。

解法

DP。
以下の2つを区間DPで求めておく。

DP1[i][j] := S[i..j]を部分列とする回文の最短の長さ
DP2[i][j] := S[i..j]を部分列とする最短の回文の総数
DP2はオーバーフローすることがあるので注意する。

答えとなる文字列Tの長さはDP1[0][N-1]であり、この文字列を両端から埋めていけばよい。