結果
| 問題 |
No.1018 suffixsuffixsuffix
|
| ユーザー |
|
| 提出日時 | 2020-04-03 23:25:58 |
| 言語 | C++14 (gcc 13.3.0 + boost 1.87.0) |
| 結果 |
AC
|
| 実行時間 | 184 ms / 2,000 ms |
| コード長 | 2,654 bytes |
| コンパイル時間 | 1,775 ms |
| コンパイル使用メモリ | 176,852 KB |
| 実行使用メモリ | 6,784 KB |
| 最終ジャッジ日時 | 2024-07-03 06:27:41 |
| 合計ジャッジ時間 | 7,529 ms |
|
ジャッジサーバーID (参考情報) |
judge3 / judge2 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 4 |
| other | AC * 34 |
ソースコード
#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;
auto cut = [&](int x) {
bool ok = true;
for (int i = 0; i < n-x && ok; i++) {
if (s[i] == s[i+x]) continue;
ok = false;
}
return ok;
};
long long t = n;
for (long long i = 1; i * i <= n; i++) {
if (n % i == 0) {
if (cut(i)) t = min(i, t);
if (cut(n/i)) t = min(n/i, t);
}
}
s = s.substr(0, t);
m *= n / t; n = t;
string u = s + s;
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;
//cout << qi << " " << curr << " " << k << " " << x << "\n";
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;
}