「ブルーブリッジカップの日常の疑問」ハッシュ・アクウイング2058. 不器用な指

1. トピックの説明

ベッシーが数値を新しい基数に変換し、その結果を書き留めるときは、いつも桁の 1 つを間違えていました。

たとえば、数値 14 を 2 進数に変換した場合、正しい結果は 1110 になりますが、0110 または 1111 と書き込む可能性があります。

Bessie は、数字を追加したり削除したりすることはありませんが、数字の入力ミスにより、先頭に 0 を含む数字を書き込む場合があります。

Bessie による数値 N の 2 進数および 3 進数への変換の結果を考慮して、N の正しい初期値 (10 進数表現) を決定します。

入力フォーマット

最初の行には N のバイナリ表現が含まれていますが、そのうちの 1 つが間違っています。

2 行目には N の 3 項表現が含まれていますが、そのうちの 1 つが間違っています。

出力フォーマット

正しい N 値を出力します。

データ範囲

N は 109 を超えてはなりません。独自の解決策があります。

入力サンプル

1010
212

出力サンプル

14

2.思考分析

考えられるすべての数値を 2 進数で計算し、保存するという非常に単純なアイデアがあります。

次に、考えられるすべての数値を 3 進法で計算し、保存します。

2 つの交点、つまり共通する数字が正解でなければなりません。

まず、バイナリの各ビットに対応する数値を列挙して変更し、直接 XOR して否定する必要があります。

次に、Qin Jiushao アルゴリズムに従って XOR 結果を 10 進数に変換し、ハッシュ配列に保存します。

最後に、3進法の各桁に対応する数値を変更して10進法に変換し、ハッシュ配列に存在するかどうかを判定します

3. Qin Jiushao アルゴリズム

Qin Jiushao のアルゴリズムは、多項式を計算できるため、10 進数に変換するための非常に効率的なアルゴリズムです。他の基数から 10 進数への変換に使用されます。

4.ACコード

import java.io.*;
import java.util.HashSet;

public class Main {

    public static void main(String[] args) throws IOException {
        BufferedReader  br=new BufferedReader(new InputStreamReader(System.in));
        String s1=br.readLine();
        String s2=br.readLine();
        //转换成字符数组,字符串无法异或
        char []c1=s1.toCharArray();
        char []c2=s2.toCharArray();
        HashSet<Integer> hs=new HashSet<>();
        for (int i = 0; i < c1.length; i++) {
            //将每位数字异或取相反数字
            c1[i]^=1;
            //转换为10进制数后添加到哈希表中
            hs.add( change(c1,2));
            //然后转换回来,方便下一位转换
            c1[i]^=1;
        }
        for (int i = 0; i < c2.length; i++) {
            char t=c2[i];
            for(char j='0';j<'3';j++){
                //如果c本位等于当前的值则跳过继续,因为必定会错一位
                if(c2[i]==j)  continue;
                //如果不是则赋j值
                c2[i]=j;
                if(hs.contains(change(c2,3))){
                    System.out.println(change(c2,3));
                    return;
                }
                c2[i]=t;
            }
        }
    }

    //根据秦九韶算法将其他进制转换为10进制数
    private static Integer change(char c[], int t) {
        int re=0;
        for (int i = 0; i < c.length; i++) {
            re=re*t+c[i]-'0';
        }
        return re;
    }

}
読んでいただきありがとうございます。間違いがあればコメントして修正してください。良いアイデアがあれば交換してください。役に立った場合は、いいねとサポートをお願いします。

おすすめ

転載: blog.csdn.net/m0_68055637/article/details/129169635