結果
| 問題 |
No.1018 suffixsuffixsuffix
|
| ユーザー |
|
| 提出日時 | 2020-04-03 22:51:21 |
| 言語 | C++14 (gcc 13.3.0 + boost 1.87.0) |
| 結果 |
WA
|
| 実行時間 | - |
| コード長 | 2,255 bytes |
| コンパイル時間 | 1,997 ms |
| コンパイル使用メモリ | 174,816 KB |
| 実行使用メモリ | 7,816 KB |
| 最終ジャッジ日時 | 2024-07-03 05:19:00 |
| 合計ジャッジ時間 | 8,479 ms |
|
ジャッジサーバーID (参考情報) |
judge4 / judge5 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 3 WA * 1 |
| other | AC * 14 WA * 20 |
ソースコード
#include"bits/stdc++.h"
using namespace std;
#define REP(k,m,n) for(int (k)=(m);(k)<(n);(k)++)
#define rep(i,n) REP((i),0,(n))
using ll = long long;
using pii = pair<int, int>;
using pll = pair<ll, ll>;
using tp3 = tuple<int, int, int>;
using Mat = vector<vector<ll>>;
constexpr int INF = 1 << 28;
constexpr ll INFL = 1ll << 60;
constexpr int dh[4] = { 0,1,0,-1 };
constexpr int dw[4] = { -1,0,1,0 };
bool isin(const int H, const int W, const int h, const int w) {
return 0 <= h && h < H && 0 <= w && w < W;
}
template<typename T>
T minch(T& l, T r) {
return l = min(l, r);
}
template<typename T>
T maxch(T& l, T r) {
return l = max(l, r);
}
template<typename T>
void output(const T& val) {
cout << val << endl;
}
template<typename T>
void output(const vector<T>& vec, const bool newline = false) {
for (const T& val : vec)cout << val << (newline ? '\n' : ' '); cout << endl;
}
template<typename T>
void output(const vector<vector<T>>& mat) {
for (const auto& row : mat)output(row);
}
// ============ template finished ============
constexpr ll MAX_N = 1e5 + 10;
int n, k;
int sa[MAX_N + 1];
int mrank[MAX_N + 1];
int tmp[MAX_N + 1];
bool compare_sa(int i, int j) {
if (mrank[i] != mrank[j])return mrank[i] < mrank[j];
else {
int ri = i + k <= n ? mrank[i + k] : -1;
int rj = j + k <= n ? mrank[j + k] : -1;
return ri < rj;
}
}
void construct_sa(string S) {
n = S.size();
rep(i, n + 1) {
sa[i] = i;
mrank[i] = i < n ? S[i] : -1;
}
for (k = 1; k <= n; k *= 2) {
sort(sa, sa + n + 1, compare_sa);
tmp[sa[0]] = 0;
for (int i = 1; i <= n; i++) {
tmp[sa[i]] = tmp[sa[i - 1]] + (compare_sa(sa[i - 1], sa[i]) ? 1 : 0);
}
for (int i = 0; i <= n; i++) {
mrank[i] = tmp[i];
}
}
}
int main()
{
ll N, M, Q;
string s;
cin >> N >> M >> Q >> s;
vector<ll> K(Q);
rep(i, Q)cin >> K[i];
construct_sa(s);
vector<ll> sa2;
REP(i, 1, N + 1)sa2.push_back(N - 1 - sa[i]);
//output(sa2);
vector<ll> res;
for (auto k : K) {
k--;
ll row = k / M, col = k % M;
res.push_back(N * M - sa2[row] - col * N);
}
output(res);
return 0;
}