問題はこちら
No.273 回文分解 - yukicoder
不要な部分は1文字にバラしてしまえば良いので、全体でない最長の回文の長さが求める値になる
int main(){ char s[99]; int i,j,k,f=1; //fはフラグ。0になったら回文が見つかった gets(s); for(i=strlen(s);f&&--i;){ //長さiの回文を探す for(j=0;f&&s[j+i-1];j++){ //s[j]から始まるi文字が回文かどうか調べる f=0; for(k=0;k<i/2;k++)if(s[j+k]!=s[j+i-1-k])f=1; } } printf("%d",i); return 0; }
iを1つずらして
char s[99]; i,j,k; main(f){ for(i=strlen(gets(s))-1;f&&--i;) for(j=0;f&&s[j+i];j++) for(k=0;k<=i/2&&!(f=s[j+k]-s[i+j-k]);k++); i=!printf("%d",i+1); }
for文圧縮
for(j=0;f&&s[j+i];j++)for(k=0;k<=i/2&&!(f=s[j+k]-s[i+j-k]);k++); for(j=0;k>i/2|(f=s[j+k]-s[i+j-k])?k=0,f&&s[++j+i]:++k;); for(i=strlen(gets(s))-1;f&&--i;)for(j=0;k>i/2|(f=s[j+k]-s[i+j-k])?k=0,j++,f&&s[j+i]:++k;); for(i=strlen(gets(s))-2;k>=i/2|(f=s[j+k]-s[i+j-k])?k=0,f&&s[++j+i]?:(j=0,f&&--i):++k;); //元の文字列の長さが2のとき、i=0でも元の2つ目for文にあたる部分が実行されてしまうので、k>=i/2とした
ということで
char s[99]; i,j,k; main(f){ for(i=strlen(gets(s))-2;k>=i/2|(f=s[j+k]-s[i+j-k])?k=0,f&&s[++j+i]?:(j=0,f&&--i):++k;); i=!printf("%d",i+1); }
133B
2017/07/25追記
strlen(gets())の代わりにreadを使うテクニックを学んだ。
char s[99]; i,j,k; main(f){ for(i=read(0,s)-3;k>=i/2|(f=s[j+k]-s[i+j-k])?k=0,f&&s[++j+i]?:(j=0,f&&--i):++k;); printf("%d",i+1); }
124B