※上記の広告は60日以上更新のないWIKIに表示されています。更新することで広告が下部へ移動します。

「aoj2261~2270」の編集履歴(バックアップ)一覧に戻る

aoj2261~2270 - (2012/07/13 (金) 18:23:36) のソース

*2261 [[iwi]]
http://judge.u-aizu.ac.jp/onlinejudge/description.jsp?id=2261
文字列から部分文字列を取得して左右対称な文字列を作るとき何文字まで作れるかを答える問題。
簡単に正答数を稼げるのはおいしい問題。
短いコードで合格している人がいるがどんなテクニックがあるのか?
左右対称という恣意的なルールを記述するのにどうしたってコード中にその部分の記述がいるはずなのだが?



 #include<stdio.h>
 #include<string.h>
 char text[20];
 int len,ans=0;
 char cpy[20];
 void saiki(int deep,int nowP){
	if(deep==len){
		//左右対称なら奇数になるはず
		char c1,c2;
		bool out=false;
		cpy[nowP]='\0';
		if(nowP%2==1&&nowP>2){
			for(int i=0;i<nowP/2;i++){
				c1=cpy[i];
				c2=cpy[nowP-i-1];
				if(c1=='i'&&c2!='i')out=true;
				if(c1=='w'&&c2!='w')out=true;
				if(c1=='('&&c2!=')')out=true;
				if(c1==')'&&c2!='(')out=true;
				if(c1=='{'&&c2!='}')out=true;
				if(c1=='}'&&c2!='{')out=true;
				if(c1=='['&&c2!=']')out=true;
				if(c1==']'&&c2!='[')out=true;
				if(out==true)return;
			}
			if(strstr(cpy,"iwi")==NULL)return;
			ans=ans>nowP?ans:nowP;
		}
	}else{
		cpy[nowP]=text[deep];//この文字を使う
		saiki(deep+1,nowP+1);
		saiki(deep+1,nowP);
	}
 }
 int main(){
	scanf("%s",text);
	len=strlen(text);
	saiki(0,0);
	printf("%d\n",ans);
 }