問題はこちら
No.22 括弧の対応 - yukicoder
k番目の文字が「(」なら右へ、「)」なら左へ探すことになる
最初の文字も含めて、「)」に遭遇したら+1、「(」に遭遇したら-1として、初めて0になった箇所が求める位置
int main(){ int n,i,t=0; char s[10010]; scanf("%*d%d",&i); scanf("%s",s+1); n=s[i]; //最初の文字を保存 t=n*2-81; //')'は41,'('は40なので2倍して81を引くことで±1を作れる while(t)t+=s[n=='('?++i:--i]*2-81; //0になるまで動く printf("%d",i); return 0; }
whileをforに書き直す
読み込みをgetsで行う
右へ動くか左へ動くかの判定n=='('?…は、nにs[i]ではなくs[i]*2-81を保存しておけばi-=nとできる
i,t; char s['~~']; main(n){ scanf("%*d%d ",&i); //後ろにスペースをいれることで改行を読み飛ばし gets(s+1); for(t=n=s[i]*2-81;t+=s[i-=n]*2-81;); t=!printf("%d",i); }
あとはいつもの
i,t; char s['~~']; main(n){ for(gets(s+scanf("%*d%d ",&i)),n=t=s[i]*2-81;t+=s[i-=n]*2-81;); t=!printf("%d",i); }
107B
2017/08/06追記
s[i]*2-81を2回も書いているのは無駄なのでぐっと睨んで1つにまとめる
コンパイラのバージョンアップによる3Bと合わせて11B短縮
n,t; char s['~~']; main(i){ for(gets(s+scanf("%*d%d ",&i));t+=s[i-=n]*2-81;n=n?:t); printf("%d",i); }
96B