結果
| 問題 |
No.515 典型LCP
|
| コンテスト | |
| ユーザー |
kazuma
|
| 提出日時 | 2017-07-26 18:40:42 |
| 言語 | C++17 (gcc 13.3.0 + boost 1.87.0) |
| 結果 |
TLE
|
| 実行時間 | - |
| コード長 | 1,637 bytes |
| コンパイル時間 | 2,479 ms |
| コンパイル使用メモリ | 207,312 KB |
| 最終ジャッジ日時 | 2025-01-05 01:53:34 |
|
ジャッジサーバーID (参考情報) |
judge3 / judge3 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 2 |
| other | WA * 1 TLE * 14 |
ソースコード
#include <bits/stdc++.h>
using namespace std;
using ll = long long;
class SegmentTree {
static const int id = 1e9;
const int n;
vector<int> data;
int size(int n) {
int res = 1;
while (res < n) res <<= 1;
return res;
}
public:
SegmentTree(int n_) :
n(size(n_)), data(n * 2, id) {}
void Init(const vector<int>& data_) {
for (int i = 0; i < (int)data_.size(); i++)
data[i + n] = data_[i];
for (int i = n - 1; i >= 0; i--)
data[i] = min(data[i * 2], data[i * 2 + 1]);
}
int Find(int l, int r) {
l += n; r += n;
int res1 = id, res2 = id;
while (l < r) {
if (l & 1) res1 = min(res1, data[l++]);
if (r & 1) res2 = min(data[--r], res2);
l >>= 1; r >>= 1;
}
return min(res1, res2);
}
};
vector<int> LCP(const vector<string>& Ss) {
int N = Ss.size();
vector<int> res(N);
for (int i = 1; i < N; i++) {
auto& S = Ss[i - 1];
auto& T = Ss[i];
int j = 0, ss = S.size(), ts = T.size();
while (j < ss && j < ts && S[j] == T[j]) {
j++;
}
res[i - 1] = j;
}
return res;
}
int main()
{
int N, M;
ll x, d;
cin >> N;
vector<string> s(N);
for (int i = 0; i < N; i++) {
cin >> s[i];
}
auto ss = s;
sort(ss.begin(), ss.end());
SegmentTree rmq(N);
auto lcp = LCP(ss);
rmq.Init(lcp);
cin >> M >> x >> d;
ll res = 0;
for (int i = 0; i < M; i++) {
ll l = x / (N - 1), r = x % (N - 1);
if (l > r) {
swap(l, r);
}
else {
r++;
}
x = (x + d) % (N * (N - 1));
l = lower_bound(ss.begin(), ss.end(), s[l]) - ss.begin();
r = lower_bound(ss.begin(), ss.end(), s[r]) - ss.begin();
if (l > r) swap(l, r);
res += rmq.Find(l, r);
}
cout << res << endl;
return 0;
}
kazuma