CSAcademy Prefix Matches
<問題>
長さの文字列、サイズの配列,が与えられます。
はの番目の文字から何文字がのprefixと一致するかを表します。
はの番目で終わる部分文字列のうち何文字がのprefixと一致するかを表します。
が与えられたときを答えよ。
<解説>
の更新方法には2種類あります。
1.
文字目から文字がのprefixと一致するので、となります。
(Aから○文字がprefixと一致するなら逆からみても一致します。)
2.
(から文字目がのprefixと一致しているならから文字目も一致します)
<コード>
int main() { int n; cin >> n; vi a(n), b(n); for (int i = 1; i < n; i++) { cin >> a[i]; } for (int i = 1; i < n; i++) { b[i + a[i] - 1] = max(b[i + a[i] - 1], a[i]); } for (int i = n - 2; i > 0; i--) { b[i] = max(b[i],b[i+1]-1); } for (int i = 1; i < n; i++) { if (i != n - 1) { cout << b[i] << " "; } else { P(b[i]); } } return 0; }
<感想>
問題文を理解するのに時間がかかった