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;
	}