[白駿1062]教え


マイロジック


に教える
これは難しい問題だ.私はビットマスクでそれを解いたが、ビットマスクの使い方は熟練していない.小さなミスで多くの時間を費やしたからだ.
まずコードを見てみましょう

これは26文字で、k種類の場合の数字を選択する問題です.
全てのビットが0である場合、kビットに対して(1<&~(1<anta、ticaは無条件に含まれるため、この2つの文字列が共通に持つ文字は含まなければならない.
したがって,まずすべてのビットが0のmask変数を宣言し,anta,ticaに含まれるアルファベットのビットを開く.
mask|=(1<<文字–a)
1~(1<26)種の場合のビット数がbit&mask=maskであれば、bitはmaskに含まれるすべてのアルファベットを含む.そして降りて
int cnt=0;
            for(int i=0; i<26; ++i){
                if(bit & (1<<i)) cnt += 1;
            }
            if(cnt != k ) continue;
このコードで発生したエラーは最も時間の無駄です.
bitで開くアルファベットはk個でなければならないので、これは1桁の論理であり、bitは1から和
ビット切替(1<ビットが1から(for(int bit=1...)ビットが0の場合、すべてのビットが0に設定されている場合、k<5|k=26の場合に処理されます.k=0がbit=0を表す場合、それ以外はbitが1以上を表す.
bitのあるforゲートは回転時に5<=k<26であり、bitは1より大きくなければならないため、bitの開始は1である.
しかもbit=0がないと思った場合は0でも大丈夫と書いてあります逆に、k=0でエラー処理を行わない場合は、k=0から、サンプルコードが正しくても、コードをコミットする際にエラー処理を行う可能性があります.
つまりbit=1で始まり、うっかりビットを切り替えても1<<1から始まります.
(1<0)は、ビット1を切換えずに1の位置に置くことを意味し、この問題では、1番目のビットが開いているか否かを計算する論理である.
最初のビットは計算されず、別のビットが計算されるため、最後の例の正解は常に4である.つまりk個を倒すということで、実質的にk+1個を倒すことになります.
したがって,(1<