結果
問題 | No.515 典型LCP |
ユーザー | はまやんはまやん |
提出日時 | 2017-05-06 02:28:46 |
言語 | C++14 (gcc 12.3.0 + boost 1.83.0) |
結果 |
TLE
|
実行時間 | - |
コード長 | 2,329 bytes |
コンパイル時間 | 2,360 ms |
コンパイル使用メモリ | 179,224 KB |
実行使用メモリ | 52,904 KB |
最終ジャッジ日時 | 2024-09-14 10:26:14 |
合計ジャッジ時間 | 7,617 ms |
ジャッジサーバーID (参考情報) |
judge1 / judge3 |
(要ログイン)
テストケース
テストケース表示入力 | 結果 | 実行時間 実行使用メモリ |
---|---|---|
testcase_00 | TLE | - |
testcase_01 | -- | - |
testcase_02 | -- | - |
testcase_03 | -- | - |
testcase_04 | -- | - |
testcase_05 | -- | - |
testcase_06 | -- | - |
testcase_07 | -- | - |
testcase_08 | -- | - |
testcase_09 | -- | - |
testcase_10 | -- | - |
testcase_11 | -- | - |
testcase_12 | -- | - |
testcase_13 | -- | - |
testcase_14 | -- | - |
testcase_15 | -- | - |
testcase_16 | -- | - |
ソースコード
#include<bits/stdc++.h> using namespace std; #define rep(i,a,b) for(int i=a;i<b;i++) typedef long long ll; #define def INT_MAX/2 template<class V, int NV> struct SegTree { V comp(V l, V r) { return min(l, r); }; vector<V> val; SegTree() { val = vector<V>(NV * 2, def); } V get(int l, int r) { //[l,r] if (l > r) return def; l += NV; r += NV + 1; V ret = def; while (l < r) { if (l & 1) ret = comp(ret, val[l++]); if (r & 1) ret = comp(ret, val[--r]); l /= 2; r /= 2; } return ret; } void update(int i, V v) { i += NV; val[i] = v; while (i>1) i >>= 1, val[i] = comp(val[i * 2], val[i * 2 + 1]); } void add(int i, V v) { update(i, val[i + NV] + v); } }; //----------------------------------------------------------------- int N, M, X, D, I[3010101], J[3010101]; string S[101010]; //----------------------------------------------------------------- void init() { cin.tie(0); ios::sync_with_stdio(false); cin >> N; rep(i, 0, N) cin >> S[i]; cin >> M >> X >> D; ll x = X, d = D, n = N; rep(i, 0, M) { I[i] = (x / (n - 1)); J[i] = (x % (n - 1)); if (I[i] > J[i]) swap(I[i], J[i]); else J[i]++; x = (x + d) % (n * (n - 1)); } } //----------------------------------------------------------------- int lcp(string a, string b) { int cnt = 0; rep(i, 0, min(a.length(), b.length())) { if (a[i] == b[i]) cnt = i + 1; else break; } return cnt; } //----------------------------------------------------------------- int m[101010], mm[101010]; SegTree<int, 1 << 20> st; void pre() { rep(i, 0, N) mm[i] = i; sort(mm, mm + N, [&](int a, int b) { return S[a] < S[b]; }); rep(i, 0, N) m[mm[i]] = i; sort(S, S + N); rep(i, 1, N) st.update(i, lcp(S[i - 1], S[i])); } //----------------------------------------------------------------- int main() { init(); pre(); ll ans = 0; rep(i, 0, M) { fprintf(stderr, "Finish : %d/%d\n", i, M); int a = m[I[i]], b = m[J[i]]; if (a > b) swap(a, b); if (a == b) { ans += S[a].length(); continue; } int c = st.get(a + 1, b); ans += c; //cout << S[a] << " + " << S[b] << " = " << c << endl; } cout << ans << endl; }