読者です 読者をやめる 読者になる 読者になる

メモ

yukicoderで遊んでいる競プロゆるふわ勢

yukicoder No.203 ゴールデン・ウィーク(1)

問題はこちら
No.203 ゴールデン・ウィーク(1) - yukicoder

順番に調べていくだけ

int main(){
	char a[15];
	int s=0,n=0,i;
	//sに現時点での最大連休数、nに現在の連休数を保存
	gets(a);gets(a+7);
	//無理やり連結
	for(i=0;i<14;i++){
		if(a[i]=='o'){
			n++;
			s=s<n?n:s;
			//休みなら連休数を増やして、最長記録と比較
		}
		else n=0;
		//休みじゃなければ連休数を0に戻す
	}
	printf("%d",s);
	return 0;
}

最大連休数の更新は、一見すると連休が終わったところ(elseのところ)でやってもいいように思えるけれど、14連休の時にだめ


これをぎゅっと縮める

char a[16];
i,s;
main(n){
	for(gets(gets(a)+7);a[i];)for(n=0;a[i++]&1;s=s<++n?n:s);
	i=!printf("%d",s);
}

ループ圧縮

char a[16];
i,s,n;
main(){
	for(gets(gets(a)+7);a[i++]&1?s=s<++n?n:s:(n=0,a[i]););
	i=!printf("%d",s);
}

97B


16/10/01追記
なんで配列使ってるんですかね……
やるべきことは要するに
'o'が来たらs=s<++n?n:s
'x'が来たらn=0
改行が来たら何もしない
EOFが来たらループを抜ける
なのだから普通にgetchar(あるいはread)でいいじゃん…

s,n;
main(i){
	for(;i=~getchar();i%7?n*=i>-12:s<++n?s=n:1);
	s=!printf("%d",s);
}

75B
readを使うとiに保存される値がbit反転するため、%7の部分を%37にしなければならず±0


2016/10/16追記
ぐっと睨むと、iが\nかxかの判別で1B縮む

s,n;
main(i){
	for(;i=~getchar();i%7?n*=~i%3:s<++n?s=n:1);
	s=!printf("%d",s);
}

74B