メモ

yukicoderでゆるふわgolf

yukicoder No.345 最小チワワ問題

問題はこちら
No.345 最小チワワ問題 - yukicoder

cを見つける毎にその後ろにwを2つ探して、その長さを調べていけば良い

int main(){
	int i,j,m=1000,t;
	//存在すれば最小値は必ず100以下
	char s[110];
	gets(s);
	for(i=0;s[i];i++){
		if(s[i]!='c')continue;
		//'c'を探す
		t=0;
		for(j=i+1;s[j];j++){
			//wが2個見つかるか末尾に来るまで探す
			if(s[j]=='w')t++;
			if(t==2)break;
		}
		if(t==2){
			//wを2個見つけたなら長さを求めて値を更新
			j=j-i+1;
			if(j<m)m=j;
		}
	}
	printf("%d",m==1000?-1:m);
	return 0;
}

とりあえず縮めやすくする

i,j,m,t;
char s[110];
main(){
	for(gets(s);s[i];i++){
		for(t=2,j=i;s[i]=='c'&&t&&s[j];j++)t-=s[j]=='w';
		if(!t){
			j-=i-2;
			//先ほどより1大きな値を保存することにした
			!m|j<m?m=j:0;
		}
	}
	m=!printf("%d",m-1);
	//mの初期値は0なので、見つからなければ-1が出力される
}

で縮める

char s[99];
i,m,t;
main(j){
	for(gets(s);s[j=i];j-=i++-2,!t&&!m|m>j?m=j:0)for(t=2;s[i]==99&&t&&s[++j];t-=s[j]=='w');
	i=!printf("%d",m-1);
}

133B

2017/07/29追記
よく考えれば前から順に見てDPすればよい。
直前に見た'c'の位置をaに、直前に見た'w'よりも前に見た'c'の位置をbに保存することで、次のように書ける

a,b,t,m=1000;
main(i){
for(;read(0,&t,1);i++){
	if(t=='c')a=i;
	if(t=='w'){
		if(b)m=fmin(m,i-b+1);
		b=a;
	}
}
printf("%d",m==1000?-1:m);
}

上と同じように、mを1ずらして初期化を省略したりなんだりして次のようにまとめられる

a,b,t,m;
main(i){
	for(;read(0,&t,1);i++)a=t-99?t==119?b&&!m|m>i-b+2?m=i-b+2:0,b=a:a:i;
	printf("%d",m-1);
}

102B