結果
| 問題 |
No.1018 suffixsuffixsuffix
|
| ユーザー |
|
| 提出日時 | 2020-04-03 22:57:46 |
| 言語 | C++14 (gcc 13.3.0 + boost 1.87.0) |
| 結果 |
WA
|
| 実行時間 | - |
| コード長 | 2,403 bytes |
| コンパイル時間 | 1,743 ms |
| コンパイル使用メモリ | 178,576 KB |
| 実行使用メモリ | 6,948 KB |
| 最終ジャッジ日時 | 2024-07-03 05:29:20 |
| 合計ジャッジ時間 | 7,817 ms |
|
ジャッジサーバーID (参考情報) |
judge3 / judge1 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 4 |
| other | AC * 29 WA * 5 |
ソースコード
#include <bits/stdc++.h>
using namespace std;
template<class T> struct SuffixArray {
int N, K;
vector<int> sa, rank, tmp;
SuffixArray(int n, T &s) : N(n) {
sa.resize(N+1);
rank.resize(N+1);
tmp.resize(N+1);
for (int i = 0; i <= N; i++) {
sa[i] = i;
rank[i] = i < N ? s[i] : -1;
}
auto compare = [&] (int i, int j) {
if (rank[i] != rank[j]) return rank[i] < rank[j];
else {
int ri = i + K <= N ? rank[i + K] : -1;
int rj = j + K <= N ? rank[j + K] : -1;
return ri < rj;
}
};
for (K = 1; K <= N; K <<= 1) {
sort(sa.begin(), sa.end(), compare);
tmp[sa[0]] = 0;
for (int i = 1; i <= n; i++) {
tmp[sa[i]] = tmp[sa[i-1]] + (compare(sa[i-1], sa[i]));
}
for (int i = 0; i <= n; i++) {
rank[i] = tmp[i];
}
}
}
// return index of i-th suffix
int operator[] (const int &i) const { return sa[i+1]; }
};
int main() {
cin.tie(nullptr);
ios::sync_with_stdio(false);
long long n, m, q; cin >> n >> m >> q;
string s; cin >> s;
string u = s + s;
sort(s.begin(), s.end());
if (s.front() == s.back()) {
for (int i = 0; i < q; i++) {
if (i) cout << " ";
long long c; cin >> c;
cout << n * m + 1 - c;
}
cout << "\n";
return 0;
}
SuffixArray<string> sf(n*2, u);
long long curr = 0; int i = 0;
vector<long long> ans(q);
for (int qi = 0; qi < q; qi++) {
long long k; cin >> k;
while (curr < k) {
auto x = sf[i] + 1;
if (x > n) {
if (curr + 1 < k) {
curr++, i++; continue;
} else if (curr + 1 == k) {
ans[qi] = (m-1) * n + (x-n);
break;
}
} else {
if (curr + (m-1) < k) {
curr += m-1, i++;
} else {
auto y = k - curr;
ans[qi] = (m-y-1) * n + x;
break;
}
}
}
}
for (int i = 0; i < q; i++) {
if (i) cout << " ";
cout << ans[i];
}
cout << "\n";
return 0;
}