結果
| 問題 |
No.515 典型LCP
|
| コンテスト | |
| ユーザー |
|
| 提出日時 | 2017-05-05 23:13:48 |
| 言語 | C++14 (gcc 13.3.0 + boost 1.87.0) |
| 結果 |
WA
|
| 実行時間 | - |
| コード長 | 2,799 bytes |
| コンパイル時間 | 1,635 ms |
| コンパイル使用メモリ | 118,248 KB |
| 実行使用メモリ | 32,668 KB |
| 最終ジャッジ日時 | 2024-09-14 09:07:58 |
| 合計ジャッジ時間 | 9,783 ms |
|
ジャッジサーバーID (参考情報) |
judge2 / judge6 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 2 |
| other | WA * 15 |
ソースコード
#define _USE_MATH_DEFINES
#include <cstdio>
#include <iostream>
#include <sstream>
#include <fstream>
#include <iomanip>
#include <algorithm>
#include <cmath>
#include <complex>
#include <string>
#include <vector>
#include <list>
#include <queue>
#include <stack>
#include <set>
#include <map>
#include <bitset>
#include <numeric>
#include <limits>
#include <climits>
#include <cfloat>
#include <functional>
#include <iterator>
using namespace std;
class RangeMinimumQuery
{
private:
int n;
vector<int> data;
int query(int a, int b, int k, int l, int r){
if(r < a || b < l)
return INT_MAX;
if(a <= l && r <= b)
return data[k];
int x = query(a, b, k*2+1, l, (l+r)/2);
int y = query(a, b, k*2+2, (l+r+1)/2, r);
return min(x, y);
}
public:
RangeMinimumQuery(int n0){ // コンストラクタ(要素数を指定)
n = 1;
while(n < n0)
n *= 2;
data.assign(2*n-1, INT_MAX);
}
RangeMinimumQuery(vector<int> vi){ // コンストラクタ(配列を指定)
int n0 = vi.size();
n = 1;
while(n < n0)
n *= 2;
data.assign(2*n-1, INT_MAX);
for(int i=0; i<n0; ++i)
data[i+n-1] = vi[i];
for(int i=n-2; i>=0; --i)
data[i] = min(data[i*2+1], data[i*2+2]);
}
void update(int k, int x){ // k番目の要素をxに変更する
k += n - 1;
data[k] = x;
while(k > 0){
k = (k - 1) / 2;
data[k] = min(data[k*2+1], data[k*2+2]);
}
}
int query(int a, int b){ // 区間[a,b]の最小値を返す
return query(a, b, 0, 0, n-1);
}
};
int main()
{
int n;
cin >> n;
vector<pair<string, int> > v(n);
for(int i=0; i<n; ++i){
cin >> v[i].first;
v[i].second = i;
}
sort(v.begin(), v.end());
vector<int> index(n);
for(int i=0; i<n; ++i)
index[v[i].second] = i;
vector<int> len(n-1, 0);
for(int i=0; i<n-1; ++i){
int maxLen = min(v[i].first.size(), v[i+1].first.size());
while(len[i] < maxLen && v[i].first[len[i]] == v[i+1].first[len[i]])
++ len[i];
}
RangeMinimumQuery rmq(len);
int m;
long long x, d;
cin >> m >> x >> d;
vector<int> a(m), b(m);
for(int i=0; i<m; ++i){
a[i] = (int)(x / (n - 1));
b[i] = (int)(x % (n - 1));
if(a[i] > b[i])
swap(a[i], b[i]);
else
++ b[i];
x = (x + d) % (n * (n - 1LL));
}
long long ans = 0;
for(int i=0; i<m; ++i){
if(a[i] == b[i])
ans += v[i].first.size();
else
ans += rmq.query(index[a[i]], index[b[i]] - 1);
}
cout << ans << endl;
return 0;
}