kmjp's blog

競技プログラミング参加記です

AIM Tech Round 3 : Div1 A. Letters Cyclic Shift

Bでしょうもない見落とししたのが痛い。
http://codeforces.com/contest/708/problem/A

問題

アルファベット小文字からなる文字列Sが与えられる。
S中の空でない連続部分列1か所に対し、文字を1つ手前に巡回させる。
こうしてできる辞書順最小の文字列は何か。

解法

Sが全て'a'なら、末尾を'z'にしよう。
そうでないなら、一番先頭にある'a'以外で構成される最長部分文字列を巡回させよう。

string S;
int L;

void solve() {
	int i,j,k,l,r,x,y; string s;
	
	cin>>S;
	L=S.size();
	FOR(i,L) if(S[i]!='a') {
		for(j=i;j<L;j++) {
			if(S[j]=='a') break;
			S[j]--;
		}
		break;
	}
	if(i==L) S[L-1]='z';
	cout<<S<<endl;
	
}

まとめ

まぁここはまだ。