問題はこちら
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