結果
| 問題 | No.6 使いものにならないハッシュ | 
| コンテスト | |
| ユーザー |  🍡yurahuna | 
| 提出日時 | 2016-04-29 10:27:40 | 
| 言語 | C++14 (gcc 13.3.0 + boost 1.87.0) | 
| 結果 | 
                                AC
                                 
                             | 
| 実行時間 | 4 ms / 5,000 ms | 
| コード長 | 2,222 bytes | 
| コンパイル時間 | 1,811 ms | 
| コンパイル使用メモリ | 173,604 KB | 
| 実行使用メモリ | 5,376 KB | 
| 最終ジャッジ日時 | 2024-09-16 16:33:18 | 
| 合計ジャッジ時間 | 2,774 ms | 
| ジャッジサーバーID (参考情報) | judge6 / judge3 | 
(要ログイン)
| ファイルパターン | 結果 | 
|---|---|
| other | AC * 32 | 
ソースコード
#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;
}
            
            
            
        