結果

問題 No.6 使いものにならないハッシュ
ユーザー 🍡yurahuna🍡yurahuna
提出日時 2016-04-29 10:27:40
言語 C++14
(gcc 13.2.0 + boost 1.83.0)
結果
AC  
実行時間 4 ms / 5,000 ms
コード長 2,222 bytes
コンパイル時間 1,808 ms
コンパイル使用メモリ 170,980 KB
実行使用メモリ 4,356 KB
最終ジャッジ日時 2023-10-14 22:59:06
合計ジャッジ時間 2,984 ms
ジャッジサーバーID
(参考情報)
judge11 / judge15
このコードへのチャレンジ(β)

テストケース

テストケース表示
入力 結果 実行時間
実行使用メモリ
testcase_00 AC 2 ms
4,348 KB
testcase_01 AC 2 ms
4,348 KB
testcase_02 AC 4 ms
4,352 KB
testcase_03 AC 2 ms
4,352 KB
testcase_04 AC 3 ms
4,352 KB
testcase_05 AC 2 ms
4,356 KB
testcase_06 AC 3 ms
4,352 KB
testcase_07 AC 3 ms
4,352 KB
testcase_08 AC 3 ms
4,348 KB
testcase_09 AC 3 ms
4,348 KB
testcase_10 AC 1 ms
4,352 KB
testcase_11 AC 2 ms
4,348 KB
testcase_12 AC 3 ms
4,348 KB
testcase_13 AC 3 ms
4,348 KB
testcase_14 AC 3 ms
4,348 KB
testcase_15 AC 3 ms
4,352 KB
testcase_16 AC 3 ms
4,348 KB
testcase_17 AC 4 ms
4,352 KB
testcase_18 AC 4 ms
4,352 KB
testcase_19 AC 4 ms
4,352 KB
testcase_20 AC 4 ms
4,348 KB
testcase_21 AC 2 ms
4,348 KB
testcase_22 AC 4 ms
4,348 KB
testcase_23 AC 3 ms
4,348 KB
testcase_24 AC 4 ms
4,348 KB
testcase_25 AC 3 ms
4,352 KB
testcase_26 AC 3 ms
4,352 KB
testcase_27 AC 3 ms
4,352 KB
testcase_28 AC 2 ms
4,348 KB
testcase_29 AC 4 ms
4,348 KB
testcase_30 AC 3 ms
4,348 KB
testcase_31 AC 4 ms
4,348 KB
権限があれば一括ダウンロードができます

ソースコード

diff #

#include <bits/stdc++.h>
using namespace std;
#define int long long   // <----!!!!!!!!!!!

#define rep(i,n) for (int i=0;i<(n);i++)
#define rep2(i,a,b) for (int i=(a);i<(b);i++)
#define rrep(i,n) for (int i=(n)-1;i>=0;i--)
#define rrep2(i,a,b) for (int i=(b)-1;i>=(a);i--)
#define all(a) (a).begin(),(a).end()

typedef long long ll;
typedef pair<int, int> P;

// 区間[a, b]に含まれる素数を列挙
vector<int> setPrime(int a, int b) {
    vector<int> prime;
    vector<bool> alive(b + 1, true);
    alive[0] = alive[1] = false;
    rep2(i, 2, b + 1) {
        if (alive[i]) {
            if (i >= a) prime.emplace_back(i);
            for (int j = 2 * i; j <= b; j += i) {
                alive[j] = false;
            }
        }
    }
    return prime;
}

int makeHash(int x) {
    if (x < 10) return x;

    int ret = 0;
    while (x > 0) {
        ret += x % 10;
        x /= 10;
    }

    return makeHash(ret);
}

signed main() {
    std::ios::sync_with_stdio(false);
    std::cin.tie(0);

    int X, Y;
    cin >> X >> Y;

    auto prime = setPrime(X, Y);
    auto a = prime;
    int N = a.size();   // !!問題文とは異なる定義!!
    rep(i, a.size()){
        a[i] = makeHash(a[i]);
    }

    bool coli = false;  // 注: 衝突は複数は起こり得ない(ように書いている)→boolで十分
    vector<int> cnt(10, 0); // cnt[i] = i の出現回数
    int j = 0;          // [i, j)
    int maxLen = 0;     // 最長の素数列の長さ
    int maxPrime = 0;   // 長さ最大の素数列の先頭の素数として、最大のもの
    rep(i, N) {

        assert(i <= j);

        while (!coli && j < N) {
            cnt[a[j]]++;
            j++;

            // a[j]が増えて2つになった→衝突の発生
            if (cnt[a[j - 1]] == 2) {
                coli = true;
                break;
            }
        }

        int nowLen = j - i - coli;
        if (maxLen <= nowLen) {
            maxLen = nowLen;
            maxPrime = prime[i];
        }

        cnt[a[i]]--;
        // a[i]が減って1個になった→衝突がなくなった
        if (cnt[a[i]] == 1) {
            coli = false;
        }

    }

    cout << maxPrime << endl;

}
0