問題はこちら
No.548 国士無双 - yukicoder
「a~mのうち、いずれか1種を2つ、残りの12種を1つ含む」というのは「a~mのうち、13種いずれもを1つ以上含み、これら以外を含まない」と同値
よって、与えられた13文字にa~mを加えたものが条件をみたすかをチェックする
s,f; main(){ for(int i=0;i<13;i++)s|=1<<(getchar()-'a'); for(int i=0;i<13;i++)if((s|1<<i)==0x1FFF){ printf("%c\n",'a'+i); f++; } if(f==0)puts("Impossible"); }
まとめやすくするためにちょっといじる
s,f; main(i){ for(;i<14;i++)s|=1<<getchar()-97; for(;i<27;i++)(s|1<<i-14)-8191||printf("%c\n",f=83+i); f||puts("Impossible"); }
まとめる
s,f; main(i){ for(;i<27;(s|1<<i++-14)-8191||printf("%c\n",f=82+i))s|=(i<14)<<getchar()-97; f||puts("Impossible"); }
ふと思ってiの増減を逆にしたら2B縮んだ
s,f;main(i){for(;i<27;(s|1<<i++-14)-8191||printf("%c\n",f=96+i))s|=(i<14)<<getchar()-97;f||puts("Impossible");} s,i=26,f;main(){for(;i;(s|1<<i)-8191||printf("%c\n",f=109-i))s|=--i/13<<109-getchar();f||puts("Impossible");} //iをmainの引数に入れられない+1B //8191との一致チェック-3B //入出力時の定数+2B //入力時の括弧省略-2B
ということで
s,i=26,f; main(){ for(;i;(s|1<<i)-8191||printf("%c\n",f=109-i))s|=--i/13<<109-getchar(); f||puts("Impossible"); }
108B