あまりここに書いてないけど、Codeforcesもちょくちょく出てます。
この回は珍しくBとCを解いたけど、全体の難易度が低かったのかイマイチな順位だった。
http://codeforces.com/contest/288/problem/A
問題
文字列長Nと文字種別数Kが与えられるとき、以下の条件を満たす文字列を答えよ。
- K種類アルファベットの小文字のみで構成されるN文字の文字列
- 隣同士の文字が一致しない
- 上記条件を満たす中で辞書順で最初の文字
条件を満たす文字列が存在しない場合は-1を返せ。
解法
K>Nならそんな文字列は存在しない。
K=1の時は、N=1なら"a"が答えで、N>1なら存在しない。
K>=2の時、最後のK-2文字はcdefg...となり、その手前はababab...とabを繰り返せばよい。
int N,K; void solve() { int f,r,i,j,k,l,x,y; GET2(&N,&K); if(K>N) { _P("-1\n"); return; } if(K==1) { if(N>1) _P("-1\n"); else _P("a\n"); return; } else if(K==2) { FOR(i,N) _P("%c",'a'+(i%2)); _P("\n"); return; } if((N-K)%2==0) { FOR(i,(N-K)/2) _P("ab"); FOR(i,K) _P("%c",'a'+i); _P("\n"); } else { FOR(i,(N-K+2)/2) _P("ab"); _P("a"); FOR(i,K-2) _P("%c",'c'+i); _P("\n"); } return; }
まとめ
地味に場合分けが多くて、本番はPretest通ったのにHackされた…。