結果
| 問題 |
No.515 典型LCP
|
| コンテスト | |
| ユーザー |
|
| 提出日時 | 2017-07-13 12:35:30 |
| 言語 | C++14 (gcc 13.3.0 + boost 1.87.0) |
| 結果 |
AC
|
| 実行時間 | 266 ms / 1,000 ms |
| コード長 | 1,925 bytes |
| コンパイル時間 | 1,792 ms |
| コンパイル使用メモリ | 106,808 KB |
| 実行使用メモリ | 26,096 KB |
| 最終ジャッジ日時 | 2024-10-07 18:08:19 |
| 合計ジャッジ時間 | 5,139 ms |
|
ジャッジサーバーID (参考情報) |
judge1 / judge2 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 2 |
| other | AC * 15 |
ソースコード
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <cmath>
#include <iostream>
#include <vector>
#include <string>
#include <algorithm>
#include <stack>
#include <queue>
#include <set>
#include <map>
#include <functional>
#include <utility>
using namespace std;
#define MOD 1000000007
#define ADD(X,Y) ((X) = ((X) + (Y)%MOD) % MOD)
typedef long long i64; typedef vector<int> ivec; typedef vector<string> svec; typedef pair<string, int> pi;
int dd[] = { 0, 1, 0, -1, 0 };
int N;
pi P[114514];
string S[114514];
int ID[114514];
#define M 200010
#define K 18
int st[K][M];
int lcp[114514];
void construct(int *a, int n)
{
copy_n(a, n, st[0]);
for (int k = 1; k < K; k++)
{
for (int i = 0; i + (1 << k) <= n; i++)
{
st[k][i] = min(st[k - 1][i], st[k - 1][i + (1 << (k - 1))]);
}
}
}
int query(int a, int b)
{
int k = 31 - __builtin_clz(b - a);
return min(st[k][a], st[k][b - (1 << k)]);
}
int main()
{
cin >> N;
for (int i = 0; i < N; i++)
{
cin >> S[i];
P[i] = { S[i] , i };
}
sort(P, P + N);
sort(S, S + N);
for (int i = 0; i < N; i++)
{
ID[P[i].second] = i;
}
for(int i=1;i<N;i++)
{
int cnt = 0;
for(int j=0;j<S[i-1].size()&&j<S[i].size();j++)
{
if(S[i-1][j]==S[i][j])cnt++;
else break;
}
lcp[i-1]=cnt;
}
construct(lcp, N-1);
/*for(int i = 0; i < N; i++)
{
cout << ID[i] << " " << P[i].second << endl;;
}
cout << endl;
/*
for(int j = 0; j < 4; j++)
{
for(int i = 0; i < N - 1; i++)
{
cout << st[j][i] << " ";
}
cout << endl;
}*/
int W; i64 x, d;
cin >> W >> x >> d;
i64 ans = 0;
for(int i =0; i<W;i++)
{
int P = x / (N-1);
int Q = x % (N-1);
if(P>Q) swap(P,Q);
else Q++;
int a = ID[P];
int b = ID[Q];
if(a> b)swap(a, b);
//cout << P << " " << Q << endl;
//cout << a << " " << b << endl;
ans += query(a,b);
//cout << ans << endl;
x = (x +d)% ((i64)N * (N-1));
}
cout << ans << endl;
return 0;
}