528,538,539,543-547

528

最初、文字列の片方のすべての部分文字列を作って、もう片方とラビンカーブでマッチングとかどうみてもTLEなコードを書いてTLE。
片方の文字列をずらしながら両方の文字列と比較して連続する文字をカウントしていった。

538

パターン文字を作ってしまうと普通にTLE。
入力文字列を左から見ていって、「str[i-2]=='I' && str[i-1]=='O' && str[i]=='I'」となったらパターンが一つ増え(ln++)、もしlnが入力のn以上となったらそのたびにPnが一つできるのでret++。

539

本店が0とdの場所にあるので、vectorに支店の場所を入れてsortして、配達場所aについて「v_i<=a & & a

543

合計から引いてくだけ。

544

シミュレーションするだけ。マス目を超えても終了ということに気をつける。

545

なぜかハマった。「友達の友達」のところが、「aはbを友達に持つ」しか保持してなかった。「bはaを友達に持つ」も追加で通った。

546

全部の組み合わせで数字を作ってsetに入れてって、その数を返した。

547

(j, i)の時点で上にいく場合と右にいく場合を考える。ue[i][j][曲がれる場合と曲がれない場合], migi[i][j][曲がれる場合と曲がれない場合]について考えると、

//3つ目のindexは、曲がれる場合0,曲がれない場合1
ue[i][j][0] = (ue[i-1][j][0]+ue[i-1][j][1])%100000; //一個下から上に動く場合(次は曲がれる)
ue[i][j][1] = (migi[i][j-1][0])%100000; //一個左から右に動く場合(次は曲がれない)
migi[i][j][0] = (migi[i][j-1][0]+migi[i][j-1][1])%100000; //一個左から右に動く場合(次は曲がれる)
migi[i][j][1] = (ue[i-1][j][0])%100000; //一個下から上に動く場合(次は曲がれない)

だから、答えは「最後に左から動く場合2つ」+「最後に下から動く場合2つ」になる。