QOJ.ac
QOJ
ID | 题目 | 提交者 | 结果 | 用时 | 内存 | 语言 | 文件大小 | 提交时间 | 测评时间 |
---|---|---|---|---|---|---|---|---|---|
#383319 | #8571. Palworld | ucup-team027 | WA | 402ms | 38056kb | C++23 | 3.6kb | 2024-04-09 10:00:29 | 2024-04-09 10:00:29 |
Judging History
answer
#include <bits/stdc++.h>
using namespace std;
#define rep(i, a, b) for(int i = a; i < (b); ++i)
#define all(x) begin(x), end(x)
#define sz(x) (int)(x).size()
typedef long long ll;
typedef pair<int, int> pii;
typedef vector<int> vi;
template <typename T> using min_heap = priority_queue<T, vector<T>, greater<T>>;
struct SuffixArray {
vi sa, lcp;
SuffixArray() {}
SuffixArray(string& s, int lim=256) { // or basic_string<int>
int n = sz(s) + 1, k = 0, a, b;
vi x(all(s)+1), y(n), ws(max(n, lim)), rank(n);
sa = lcp = y, iota(all(sa), 0);
for (int j = 0, p = 0; p < n; j = max(1, j * 2), lim = p) {
p = j, iota(all(y), n - j);
rep(i,0,n) if (sa[i] >= j) y[p++] = sa[i] - j;
fill(all(ws), 0);
rep(i,0,n) ws[x[i]]++;
rep(i,1,lim) ws[i] += ws[i - 1];
for (int i = n; i--;) sa[--ws[x[y[i]]]] = y[i];
swap(x, y), p = 1, x[sa[0]] = 0;
rep(i,1,n) a = sa[i - 1], b = sa[i], x[b] =
(y[a] == y[b] && y[a + j] == y[b + j]) ? p - 1 : p++;
}
rep(i,1,n) rank[sa[i]] = i;
for (int i = 0, j; i < n - 1; lcp[rank[i++]] = k)
for (k && k--, j = sa[rank[i] - 1];
s[i + k] == s[j + k]; k++);
}
};
struct RMQ {
vector<vector<int>> jmp;
RMQ(const vector<int>& V) : jmp(1, V) {
for (int pw = 1, k = 1; pw * 2 <= sz(V); pw *= 2, ++k) {
jmp.emplace_back(sz(V) - pw * 2 + 1);
rep(j,0,sz(jmp[k]))
jmp[k][j] = min(jmp[k - 1][j], jmp[k - 1][j + pw]);
}
}
RMQ() {}
int query(int a, int b) {
assert(a < b); // or return inf if a == b
int dep = 31 - __builtin_clz(b - a);
return min(jmp[dep][a], jmp[dep][b - (1 << dep)]);
}
};
struct PalRev {
int n;
SuffixArray SA;
RMQ rmq;
vector<int> sa_id;
PalRev(string s) {
n = s.size();
string t = s;
t += "#";
reverse(s.begin(), s.end());
t += s;
SA = SuffixArray(t);
rmq = RMQ(SA.lcp);
sa_id.resize(SA.sa.size());
for (int i = 0; i < sa_id.size(); i++) {
sa_id[SA.sa[i]] = i;
}
}
int getMxLen(int a, int b) { // if [a, b) were removed, what's the maximum palindrome centered at removal point
// abcdef
// fdecba
// remove [1, 3)
// lcp of [3] front
// vs [5] back
int id1 = b;
int id2 = n-a;
int l = sa_id[id1];
int r = sa_id[id2+n+1];
if (l > r) swap(l, r);
return rmq.query(l, r);
}
};
array<vi, 2> manacher(const string& s) {
int n = sz(s);
array<vi,2> p = {vi(n+1), vi(n)};
rep(z,0,2) for (int i=0,l=0,r=0; i < n; i++) {
int t = r-i+!z;
if (i<r) p[z][i] = min(t, p[z][l+t]);
int L = i-p[z][i], R = i+p[z][i]-!z;
while (L>=1 && R+1<n && s[L-1] == s[R+1])
p[z][i]++, L--, R++;
if (R>r) l=L, r=R;
}
return p;
}
void solve() {
int n, k; cin >> n >> k;
string s; cin >> s;
auto pls = manacher(s);
PalRev hrv(s);
int ans = 0;
for (int p = 0; p < 2; p++) {
for (int i = 0; i < pls[p].size(); i++) {
int pallen = pls[p][i]*2 + p;
int lp = i - pls[p][i];
int rp = lp + pallen;
ans = max(ans, pallen + k);
//cout << p << ' ' << i << ' ' << lp << ' ' << rp << '\n';
for (int offset = 0; offset <= k; offset++) {
int lpal = lp-offset;
int rpal = rp;
if (lpal < 0) break;
int len = hrv.getMxLen(lpal, rpal);
ans = max(ans, pallen + offset*2 + len*2);
}
for (int offset = 0; offset <= k; offset++) {
int lpal = lp;
int rpal = rp+offset;
if (rpal > n) break;
int len = hrv.getMxLen(lpal, rpal);
ans = max(ans, pallen + offset*2 + len*2);
}
}
}
cout << ans << '\n';
}
signed main() {
ios::sync_with_stdio(0); cin.tie(0);
int t; cin >> t;
while (t--) {
solve();
}
return 0;
}
详细
Test #1:
score: 100
Accepted
time: 0ms
memory: 3556kb
input:
4 1 3 a 4 1 icpc 4 2 icpc 8 4 icecream
output:
4 5 5 11
result:
ok 4 number(s): "4 5 5 11"
Test #2:
score: 0
Accepted
time: 291ms
memory: 37892kb
input:
1 200000 66 jsmwjmibgkjvdscqllsxpaxiycmpauhnzschbivtqbjfrxrqvhvfbqecozjewqqpwdfbeqppjkgxhbnniopkptkygspcdswhwadfwhnzovvpshgcdukrupeztkpxwhmctaquqbxtidzbbxsyuaeikuldaoeudletrsmqptaejibkymsjhmwykqsjdvvdaqwelrcpxwrwhuvodipjniowfofbjktkdezwqqbvwsppsmpilntmdmlxgkaxymnugmmcsljkjzjuudnllydwdwwanadynsoiolso...
output:
141
result:
ok 1 number(s): "141"
Test #3:
score: 0
Accepted
time: 402ms
memory: 38056kb
input:
1 200000 100 qhiaajzxinenucrnfffumuhnovpuwcnojbhsktztapgyivmfqrlntwazwnfetwqieckxcnkskpidltiydfoveaucckximydxxfbiwbdufmbhywqkflyqxbijakadqkzftlciccbpnldsqhtjxuxnvkusvizavuyfhdroiuominebadhfqzrpjnzpgyvkejfwmueiltyeqpvwrkanqknyacqganbszktocfuvvsfrboaennwpaabfdnaurvvurysrijnfaonesihbhrrvbvyhpbremsuhhbc...
output:
209
result:
ok 1 number(s): "209"
Test #4:
score: -100
Wrong Answer
time: 51ms
memory: 3640kb
input:
10000 21 7 fhcjhdjcfbfbdeeheibhg 18 8 hccgjfaadefhjhcijc 15 7 ahefiiheaigjiid 15 3 fgjjebidbfgbdij 15 5 jccebbgjbhifjhb 20 2 hcbddhibgfccjjcfebcc 19 1 ehbdgiicchijebidbcd 20 8 gbcfghefhbjggecdhcbj 17 2 jjaeaccjbcfiehfdd 23 4 iafjedfbebbhcfgfjbehdaf 22 1 jgiiiaacehcbaiehfggcfi 17 2 jefbbfigfhbhfcici ...
output:
19 21 17 9 12 10 8 18 9 13 6 9 23 9 24 21 5 23 7 16 9 23 25 11 17 13 14 5 20 5 21 11 9 11 16 16 21 21 19 14 13 21 21 9 11 9 20 15 6 24 11 7 21 12 11 8 9 19 25 7 10 10 13 22 17 14 8 15 7 20 16 13 13 15 5 11 23 19 17 21 15 8 20 17 24 15 24 10 15 22 9 22 7 23 21 13 18 9 13 10 11 11 9 13 7 21 15 19 9 26...
result:
wrong answer 1st numbers differ - expected: '17', found: '19'