TopCoder SRM 343 Div1 CDPlayer
問題
CDプレイヤーのランダム再生機能は、以下のような方法で曲を再生する。
- n曲をランダムに並べ替える
- その順に曲を再生する
- 全ての曲の再生が終わったら、最初に戻る
n曲(AからA+n-1までのアルファベットで表される)の入ったCDをプレイヤーで再生した。
最初の何曲かは聞いていなかった。
再生された曲の順序が与えられるとき、このCDプレイヤーは上のルールにしたがって曲を再生しているといえる。
いえるなら、「曲の一巡」が始まった位置の候補のうち、最も最初の位置を返せ。
いえないなら、-1を返せ。
制約条件
再生された曲のリストの長さ≦2500
n≦26
方針
一巡の開始位置の候補はn通りしかないので、全通り確かめる。
ソースコード
class CDPlayer { public: int isRandom(vector <string> songlist, int n) { string s=accumulate(all(songlist),string()); rep(p,min((int)s.size(),26)){ int cnt[26]={}; rep(i,p)cnt[s[i]-'A']++; rep(i,26)if(i>n&&cnt[i]||cnt[i]>1)goto FAIL; for(int i=p;i<s.size();i+=n){ rep(j,26)cnt[j]=0; rep(j,n)if(i+j<s.size())cnt[s[i+j]-'A']++; rep(j,26)if(j>n&&cnt[j]||cnt[j]>1)goto FAIL; } return p; FAIL:; } return -1; }