結果
| 問題 |
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;
}
🍡yurahuna