結果
問題 | No.515 典型LCP |
ユーザー | tubo28 |
提出日時 | 2017-06-13 17:44:23 |
言語 | C++17 (gcc 12.3.0 + boost 1.83.0) |
結果 |
WA
|
実行時間 | - |
コード長 | 3,109 bytes |
コンパイル時間 | 2,361 ms |
コンパイル使用メモリ | 216,960 KB |
実行使用メモリ | 37,284 KB |
最終ジャッジ日時 | 2024-09-24 16:58:30 |
合計ジャッジ時間 | 4,383 ms |
ジャッジサーバーID (参考情報) |
judge5 / judge4 |
(要ログイン)
テストケース
テストケース表示入力 | 結果 | 実行時間 実行使用メモリ |
---|---|---|
testcase_00 | WA | - |
testcase_01 | WA | - |
testcase_02 | WA | - |
testcase_03 | AC | 2 ms
6,940 KB |
testcase_04 | AC | 2 ms
6,944 KB |
testcase_05 | AC | 72 ms
27,936 KB |
testcase_06 | AC | 69 ms
27,932 KB |
testcase_07 | AC | 70 ms
27,832 KB |
testcase_08 | AC | 78 ms
27,944 KB |
testcase_09 | AC | 74 ms
28,412 KB |
testcase_10 | AC | 75 ms
28,224 KB |
testcase_11 | AC | 73 ms
28,288 KB |
testcase_12 | AC | 75 ms
28,316 KB |
testcase_13 | WA | - |
testcase_14 | AC | 21 ms
6,940 KB |
testcase_15 | AC | 71 ms
27,728 KB |
testcase_16 | AC | 72 ms
27,648 KB |
ソースコード
#include <vector> #include <algorithm> template<typename T> class sparce_table { private: std::vector<char> log2; std::vector<std::vector<T>> range_min; public: sparce_table() {} template<typename It> sparce_table(It l, It r) { int n = r - l; log2.resize(n + 1); log2[1] = 0; for (int i = 2; i <= n; ++i) log2[i] = log2[i / 2] + 1; range_min.emplace_back(l, r); for (int i = 1;; ++i) { int w = 1 << i; if (n + 1 < w) break; range_min.emplace_back(n + 1 - w); for (int l = 0; l < n + 1 - w; ++l) { range_min[i][l] = std::min(range_min[i - 1][l], range_min[i - 1][l + w / 2]); } } } T rmq(int l, int r) { int i = log2[r - l]; int rr = r - (1 << i); return std::min(range_min[i][l], range_min[i][rr]); } }; #include <bits/stdc++.h> using namespace std; using ll = long long; #define FOR(i, a, b) for (int i = (a); i < int(b); ++i) #define RFOR(i, a, b) for (int i = (b)-1; i >= int(a); --i) #define rep(i, n) FOR(i, 0, n) #define rep1(i, n) FOR(i, 1, int(n) + 1) #define rrep(i, n) RFOR(i, 0, n) #define rrep1(i, n) RFOR(i, 1, int(n) + 1) #define all(c) begin(c), end(c) const int MOD = 1000000007; template <typename T> void __dump__(std::ostream &os, const T &first) { os << first; } template <typename First, typename... Rest> void __dump__(std::ostream &os, const First &first, const Rest &... rest) { os << first << ", "; __dump__(os, rest...); } #define dump(...) \ do { \ std::ostringstream os; \ os << __LINE__ << ":\t" << #__VA_ARGS__ << " = "; \ __dump__(os, __VA_ARGS__); \ std::cerr << os.str() << std::endl; \ } while (0) int n; vector<string> ss; int m, x, d; int lcp_len(const string &a, const string &b) { int i = 0; while (i < (int)a.size() && i < (int)b.size() && a[i] == b[i]) { ++i; } return i; } int main() { while (cin >> n) { ss.resize(n); rep(i, n) cin >> ss[i]; cin >> m >> x >> d; vector<int> idx(n), ridx(n); iota(all(idx), 0); sort(all(idx), [&](int a, int b) { return ss[a] < ss[b]; }); rep(i, n) ridx[idx[i]] = i; vector<int> i(m), j(m); rep(k, m) { i[k] = (x / (n - 1)) + 1; j[k] = (x % (n - 1)) + 1; if (i[k] > j[k]) swap(i[k], j[k]); else j[k] = j[k] + 1; x = (x + d) % (n * (n - 1)); } vector<int> lcp(n - 1); rep(i, n - 1) lcp[i] = lcp_len(ss[idx[i]], ss[idx[i + 1]]); sparce_table<int> st(all(lcp)); int res = 0; rep(k, m) { int a = ridx[i[k] - 1], b = ridx[j[k] - 1]; if (a > b) swap(a, b); res += st.rmq(a, b); } cout << res << endl; } }