中级农民
- 积分
- 101
- 大米
- 颗
- 鳄梨
- 个
- 水井
- 尺
- 蓝莓
- 颗
- 萝卜
- 根
- 小米
- 粒
- 学分
- 个
- 注册时间
- 2015-6-2
- 最后登录
- 1970-1-1
|
已经AC了, 把自己的代码贴上来, 这个地方需要自己写个哈希, 系统自带的__gnu_cxx::hash_map要快于unordered_map, 但是还是tle,
自己写的则快很多:
- #include <iostream>
- #include <algorithm>
- #include <cstdio>
- #include <cstdlib>
- #include <cstring>
- #include <map>
- #include <unordered_map>
- #include <unordered_set>
- #include <ext/hash_map>
- using namespace std;
- using __gnu_cxx::hash_map;
- int n;
- int a[10001];
- const int BUCKET_SIZE = 42839;
- const int NEXT_POS = 7;
- typedef struct _my_hash
- {
- int _bucket[BUCKET_SIZE];
- int _key[BUCKET_SIZE];
- _my_hash()
- {
- memset(_bucket, 0, sizeof(_bucket[0]) * BUCKET_SIZE);
- memset(_key, 0, sizeof(_key[0]) * BUCKET_SIZE);
- }
- void insert(int key, int value)
- {
- int mod = key % BUCKET_SIZE;
- while (_key[mod] != 0)
- {
- mod = (mod + NEXT_POS) % BUCKET_SIZE;
- }
- _bucket[mod] = value;
- _key[mod] = key;
- }
- int find(int key)
- {
- int origin = key % BUCKET_SIZE;
- int mod = key % BUCKET_SIZE;
- while (_key[mod] != 0)
- {
- if (_key[mod] == key)
- {
- return _bucket[mod];
- }
- mod = (mod + NEXT_POS) % BUCKET_SIZE;
- if (mod == origin)
- {
- return -1;
- }
- }
- return -1;
- }
- }my_hash_t;
- //let's assume that sequence s(n) = a[i] s(n+1) = a[j]
- //dp_matrix[i][j] represent the count of sequence in s
- short int dp_matrix[10001][10001];
- int main()
- {
- //cin >> n;
- scanf("%d", &n);
- for (int i = 0; i < n; ++i)
- //cin >> a[i];
- scanf("%d", &a[i]);
- sort(&a[0], &a[n]);
- //unordered_map<int, int> element_map;
- //map<int, int> element_map;
- //hash_map<int, int> element_map(42839);
- my_hash_t my_hash;
- //hash_map<int, int> element_map;
- for (int i = 0; i < n; ++i)
- {
- //element_map[a[i]] = i;
- my_hash.insert(a[i], i);
- }
- memset(dp_matrix, 0, sizeof(dp_matrix[0][0]) * 10001 * 10001);
- short int max_len = 0;
- //const auto iter_end = element_map.end();
- for (int i = 0; i < n; ++i)
- {
- for (int j = i + 1; j < n; ++j)
- {
- int cur_delta = a[j] - a[i];
- int k_value = a[i] - cur_delta;
- //auto iter = element_map.find(k_value);
- //auto iter = element_map.end();
- int ret = my_hash.find(k_value);
- //if (iter != iter_end)
- if (ret != -1)
- {
- //dp_matrix[i][j] = dp_matrix[iter->second][i] + 1;
- dp_matrix[i][j] = dp_matrix[ret][i] + 1;
- }
- else
- {
- dp_matrix[i][j] = 2;
- }
- if (dp_matrix[i][j] > max_len)
- {
- max_len = dp_matrix[i][j];
- }
- }
- }
- cout << max_len << endl;
- return 0;
- }
复制代码 |
|