QOJ.ac
QOJ
ID | 题目 | 提交者 | 结果 | 用时 | 内存 | 语言 | 文件大小 | 提交时间 | 测评时间 |
---|---|---|---|---|---|---|---|---|---|
#686292 | #9514. 研心 | hos_lyric# | 50 | 623ms | 94472kb | C++14 | 6.7kb | 2024-10-29 10:37:05 | 2024-10-29 10:37:06 |
Judging History
answer
#include <cassert>
#include <cmath>
#include <cstdint>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <algorithm>
#include <bitset>
#include <complex>
#include <deque>
#include <functional>
#include <iostream>
#include <limits>
#include <map>
#include <numeric>
#include <queue>
#include <random>
#include <set>
#include <sstream>
#include <string>
#include <unordered_map>
#include <unordered_set>
#include <utility>
#include <vector>
using namespace std;
using Int = long long;
template <class T1, class T2> ostream &operator<<(ostream &os, const pair<T1, T2> &a) { return os << "(" << a.first << ", " << a.second << ")"; };
template <class T> ostream &operator<<(ostream &os, const vector<T> &as) { const int sz = as.size(); os << "["; for (int i = 0; i < sz; ++i) { if (i >= 256) { os << ", ..."; break; } if (i > 0) { os << ", "; } os << as[i]; } return os << "]"; }
template <class T> void pv(T a, T b) { for (T i = a; i != b; ++i) cerr << *i << " "; cerr << endl; }
template <class T> bool chmin(T &t, const T &f) { if (t > f) { t = f; return true; } return false; }
template <class T> bool chmax(T &t, const T &f) { if (t < f) { t = f; return true; } return false; }
#define COLOR(s) ("\x1b[" s "m")
// alphabet is [OFFSET, OFFSET + SIZE), with sentinel (OFFSET - 1)
template <class T, int SIZE, T OFFSET> struct Depam {
struct Node {
// ts[pos, pos + len]: prefix/suffix when created
// fail: longest proper palindromic prefix/suffix
// quick[a]: longest proper palindromic prefix/suffix followed/preceded by a
int len, pos, fail;
int nxt[SIZE], quick[SIZE];
};
// nodes[0]: length 0 (also means null in nxt)
// nodes[1]: length -1
// nodes[2, nodesLen): non-empty palindromic substring
// pre/suf: node for longest palindromic prefix/suffix
int nodesLen, pre, suf;
vector<Node> nodes;
// current whole string: ts[l, r) (-nL <= l <= 0 <= r <= nR)
int nL, nR, l, r;
vector<T> tsBuffer;
T *ts;
// ((~pre)/suf before pushFront/pushBack, parent of created node or -1)
int historyLen;
vector<pair<int, int>> history;
Depam(int nL_, int nR_) : nL(nL_), nR(nR_) {
nodesLen = 2;
pre = suf = 0;
nodes.resize(2 + nL + nR);
nodes[0].len = 0; nodes[0].pos = 0; nodes[0].fail = 1;
nodes[1].len = -1; nodes[1].pos = 0; nodes[1].fail = 1;
memset(nodes[0].nxt, 0, sizeof(nodes[0].nxt));
memset(nodes[1].nxt, 0, sizeof(nodes[1].nxt));
for (int a = 0; a < SIZE; ++a) nodes[0].quick[a] = 1;
for (int a = 0; a < SIZE; ++a) nodes[1].quick[a] = 1;
l = r = 0;
tsBuffer.assign(1 + nL + nR + 1, OFFSET - 1);
ts = tsBuffer.data() + (1 + nL);
historyLen = 0;
history.resize(nL + nR);
}
const Node &operator[](int u) const {
return nodes[u];
}
void pushFront(T t) {
assert(-nL < l);
const int a = t - OFFSET;
history[historyLen++] = make_pair(~pre, -1);
ts[--l] = t;
if (ts[l + 1 + nodes[pre].len] != t) pre = nodes[pre].quick[a];
Node &f = nodes[pre];
if (!f.nxt[a]) {
history[historyLen - 1].second = pre;
Node &g = nodes[nodesLen];
g.len = f.len + 2; g.pos = l; g.fail = nodes[f.quick[a]].nxt[a];
memset(g.nxt, 0, sizeof(g.nxt));
memcpy(g.quick, nodes[g.fail].quick, sizeof(g.quick));
g.quick[ts[l + nodes[g.fail].len] - OFFSET] = g.fail;
f.nxt[a] = nodesLen++; // this needs to be after setting g.fail
}
if (nodes[pre = f.nxt[a]].len == r - l) suf = pre;
}
void pushBack(T t) {
assert(r < nR);
const int a = t - OFFSET;
history[historyLen++] = make_pair(suf, -1);
ts[r++] = t;
if (ts[r - 2 - nodes[suf].len] != t) suf = nodes[suf].quick[a];
Node &f = nodes[suf];
if (!f.nxt[a]) {
history[historyLen - 1].second = suf;
Node &g = nodes[nodesLen];
g.len = f.len + 2; g.pos = r - g.len; g.fail = nodes[f.quick[a]].nxt[a];
memset(g.nxt, 0, sizeof(g.nxt));
memcpy(g.quick, nodes[g.fail].quick, sizeof(g.quick));
g.quick[ts[r - 1 - nodes[g.fail].len] - OFFSET] = g.fail;
f.nxt[a] = nodesLen++; // this needs to be after setting g.fail
}
if (nodes[suf = f.nxt[a]].len == r - l) pre = suf;
}
void undo() {
const pair<int, int> h = history[--historyLen];
if (h.first < 0) {
// pushFront
if (nodes[pre].len == r - l) suf = nodes[suf].fail;
pre = ~h.first;
if (~h.second) {
--nodesLen;
nodes[h.second].nxt[ts[l] - OFFSET] = 0;
}
ts[l++] = OFFSET - 1;
} else {
// pushBack
if (nodes[suf].len == r - l) pre = nodes[pre].fail;
suf = h.first;
if (~h.second) {
--nodesLen;
nodes[h.second].nxt[ts[r - 1] - OFFSET] = 0;
}
ts[--r] = OFFSET - 1;
}
}
void dfsPrint(ostream &os, int u, const string &branch, int type) const {
const Node &f = nodes[u];
os << branch << ((type == 0) ? "" : (type == 1) ? "|-- " : "`-- ");
if (f.len <= 0) {
os << "(" << f.len << ")";
} else {
for (int i = f.pos; i < f.pos + f.len; ++i) os << ts[i];
}
os << " " << u << " " << f.fail;
// debug here
os << "\n";
int a0 = -1;
for (int a = 0; a < SIZE; ++a) if (f.nxt[a]) a0 = a;
for (int a = 0; a < SIZE; ++a) if (f.nxt[a]) {
dfsPrint(os, f.nxt[a],
branch + ((type == 0) ? "" : (type == 1) ? "| " : " "),
(a == a0) ? 2 : 1);
}
}
friend ostream &operator<<(ostream &os, const Depam &depam) {
depam.dfsPrint(os, 0, " ", 0);
depam.dfsPrint(os, 1, "", 0);
return os;
}
};
////////////////////////////////////////////////////////////////////////////////
char buf[400'010];
int M, N;
vector<string> S, T;
int main() {
for (; ~scanf("%d%d", &M, &N); ) {
S.resize(M); for (int i = 0; i < M; ++i) { scanf("%s", buf); S[i] = buf; }
T.resize(N); for (int j = 0; j < N; ++j) { scanf("%s", buf); T[j] = buf; }
int maxTLen = 0;
for (int j = 0; j < N; ++j) chmax(maxTLen, (int)T[j].size());
Int ans = 0;
for (int i = 0; i < M; ++i) {
Depam<char, 26, 'a'> pam(0, (int)S[i].size() + maxTLen);
int base = 0;
for (const char s : S[i]) {
pam.pushBack(s);
if (pam[pam.suf].len & 1) chmax(base, pam[pam.suf].len);
}
for (int j = 0; j < N; ++j) {
int mx = base;
for (const char t : T[j]) {
pam.pushBack(t);
if (pam[pam.suf].len & 1) chmax(mx, pam[pam.suf].len);
}
mx = (mx + 1) / 2;
// cerr<<i<<" "<<j<<": "<<mx<<endl;
ans += mx;
for (const char t : T[j]) {
pam.undo();
}
}
}
printf("%lld\n", ans);
}
return 0;
}
详细
Subtask #1:
score: 20
Accepted
Test #1:
score: 20
Accepted
time: 2ms
memory: 4044kb
input:
10 100 aabaababaaaababbabaaaababaababbbaabbbaabaabaabbbaababaaababbaababababbbaababbbbbbbbaabbbbaabbbbbbbbaabaabbbaabbbbbabbbbbaabbbaabaa bbaaabaabbbbaaabaaaaabbbbbabaabbabbaabbaabbaabbabbababaabaabbaabbbbbbaaaabbbbabaaaabaaabbbabaaaaaabbaaaabbbabbbbbaaaabbabaababbaabbaaabbbbbbaaaabbbababaabbaaaba b...
output:
10468
result:
ok single line: '10468'
Test #2:
score: 20
Accepted
time: 2ms
memory: 4052kb
input:
10 100 abbacbbaabababcaabbaabbbabcaccabcabbabbbccaacabaabacccbacaaabbaaabbbaacaabbabcabbbcbacaaaaabaaaabaaacbbccbacacbbaaccacbabcbccacbaaacaaacccbabbaccacaaacaabbbccaaccbbabaabcbbcbcbb bccabcacbacccbcababaccccaaabbccacaccccabbaabbcacabaccabacbbbaaaabaabccbcaacaaccbcacabcbbbcccccabccbaababccccabcabab...
output:
6384
result:
ok single line: '6384'
Test #3:
score: 20
Accepted
time: 6ms
memory: 3968kb
input:
50 50 aaaaabbabbbbbaababbaaaababaababababbbbaabaaaaaaaabaabbaaabaaaabaaabaabbbabbbababbbbabbbabbaaababbabaabbabbabbabbaaababaaaaabbbbbbaabaabaabbbbbabaaababb abbabbbaabaaaaabababaabbabaabbbbab bababbbbaabaabbaabbbbaabaabbbaabbbbaaabbabbbaaabbbbaaabaabbaaaaaabbbabaaaaabbaabaabaaabaaababbbbbaaabbbbbba...
output:
21362
result:
ok single line: '21362'
Test #4:
score: 20
Accepted
time: 5ms
memory: 4348kb
input:
50 50 aababcabbbcbaacaaaaccababbacbbaaabcbaaccabbababbcccaacaaaacacbcbaaabaacabbbbbbaccaaacbbacaacacbcccbbacabbcbcbacababcbbacaccaacacbcccbababaccabccccbabaccababccccbcbabcabcabccaaccababcbccacbbaaaacc cbaccababccbaaacbccabbcccacacacaaaabaaababcacabaccbccacbcbaaaaabbacbbaccabba ccbcbcacbcaccabbbccaa...
output:
13421
result:
ok single line: '13421'
Test #5:
score: 20
Accepted
time: 145ms
memory: 4112kb
input:
1000 1000 a aabbab bbbbababbbba bb baaaaa ba a baa a bbaaaabaaaba ba a a a bbababbbbbb b aaabb bbbbbaabbabab bbaaa aaaa aa aaaaaababb a bbaba baaa aabbab babaab b aab bbbabb aaaabbbbbaaaaaa bbbbbbbaabab bb ab aaa aaababb babaaaabab aa aaabaaababa abbabaaaaabb bbaa abaabb baa abba aaaa abbbb aab b aa...
output:
3159935
result:
ok single line: '3159935'
Subtask #2:
score: 30
Accepted
Test #6:
score: 30
Accepted
time: 28ms
memory: 94332kb
input:
1 10000 bcacacbcdadbcbccbdddaaddabcaccccbaabbcdcdaabdacccadacbbbabdaaacadacdccadcbdadadcaaabdbdbdcdcccbacbdbccacbdadcaaaacbabdadcacdcacadcadaabdaaabccccdcbcdbcadcaabbbaacaadaccdaccadbddcdbccbcddcaadcaadaadbbaadbcdbddbcbadbccbaddaacabcdccbadaddcadcbababccabcaadbcbdbcbbcdcbdbcdbdaaddbacddcabbbdccbddba...
output:
1160913325
result:
ok single line: '1160913325'
Test #7:
score: 30
Accepted
time: 19ms
memory: 94472kb
input:
1 1000 caaadbacdaaccbdcaccbdbddcdaccaaaaaccdccaadbadbcdccaacdadcccaddadcbacbbdcaadbbcdaddcadddccdbabccdadcaacabcabbbdbbbbdbbaaccddcdddcddddddbdbbadbddcbacdcdbdabcbbdbbaaadbdacaccdbaaabacbacabdaccaabaadddccbabacdbdddbdcadadcdccabaabbccbacddddcbcdbabaadaddbbdabadaccbdbaaabdadadaadabbdbadacacbdcbcbdccc...
output:
134272327
result:
ok single line: '134272327'
Test #8:
score: 30
Accepted
time: 23ms
memory: 94276kb
input:
1 10000 bbcbcaacaaaacacbacacbaacbacbaababaacacbacbacbccaacbbacbbccababcaaaccabaaccbbbaaaabbababaacbbccabcaccaaccbacccaacabcaacacaccababbbbbcbacaaabbcbaccacaaaaabbacbbcbbcabccaabcabcabaabbbabbababbabcacbcaccabacaababbacccabbcaaacacccbcbcccbbbbaababbabcaaabaccccbbbabccabacbcbabccccaccbcccccbcccccccbbc...
output:
1375114968
result:
ok single line: '1375114968'
Test #9:
score: 30
Accepted
time: 20ms
memory: 94352kb
input:
1 10000 cbaacaaaaccacaacbbcacabccbbabbababbababbacbababbcabcbacabbaaaacccacbbaaacacbacccbababaabccbbcabbbcaacbcbbbcbcbccccbabcacccccaabbbccacccacabccbcccbaaaccbbbacbaabbcbaabccccaabacabccaaccbbbaccbbcbcaabcaacbcbbcacbcbcabbacbababcbcabcbaabbbbbcccccbcacbabbcccccaacccbaccbaacbccbcababbabcbbccbbbbacab...
output:
1363955024
result:
ok single line: '1363955024'
Test #10:
score: 30
Accepted
time: 27ms
memory: 94284kb
input:
1 10000 aacbabccacabcccbccbbcacbbcbcacbbcacbbcbcacacbaaabbbbccaabcbbccccaccccbbcbbcacbbcbbcacbbcbcacacbaaabbbbccaabcbbccccaccccbbcbcbbccccaccccbbbccccaccccbbcbcbbccccaccccbbcbaaccbbbbaaaaabbbbccaabcbbccccaccccbbcbcbbccccaccccbbbccccaccccbbcbcbbccccaccccbbcbaaccbbbbaaabcacacbcbbcacbbcacacbaaabbbbccaa...
output:
1951994915
result:
ok single line: '1951994915'
Test #11:
score: 30
Accepted
time: 20ms
memory: 94260kb
input:
1 10000 bbaabbaaaabbbaaabbbaabaabaababbbbbabaabbababaaabbbbbbabbaaaabbbbbbaabababbbbabbaababbbbabaabaabaaabbabababbbbbaabababbaabbabbbababbbabaaaaabaaaaaaabaabaaabababbbabbabbaaaabababbbbabaabbaaababbaabbbbabbabbabbabbabaababaaaabbbaabbaababbabbbbaaaaaaaaaababbbbabbbabbaabbbbaaabaabbbbbaabbaababbaba...
output:
424739578
result:
ok single line: '424739578'
Subtask #3:
score: 0
Time Limit Exceeded
Test #12:
score: 20
Accepted
time: 623ms
memory: 11196kb
input:
100 1000 abbabbbbabbbbabaabaabbbbabaaabbbaabaabbabaabaabbaabbaabbababbabbababbbaabaabbaabbbabaabbbaaaabaaaabaababbaaaaaaaaabaabbaababbbbbbabbbabbbbababbbaaaaaabaaaabaaabbabbaaaaabbbabbabaabbabababbaaababbbaaaabbabbbabbabbabbbbbbabaabaabbbaabaaabbaabbabbbbaabbabaaabaabaabbbabbbbbabaababbbabababaabbba...
output:
1289287
result:
ok single line: '1289287'
Test #13:
score: 0
Time Limit Exceeded
input:
1000 1000 babbbabaabaaaabbbbbababaaabbaabbbbbabbaababbbbaaabbbbaaabbbababbaaaabaaabbbbbbbbaabbabbbabbabbaaabaabbbbbbbababaabbbbabaaabbaaaaabbbaababbaaaaabbbbaaaabbbaabaaababaaabbabbbabbabbbabbaabbabbbabaaaaaabaabbabbababbbbbabaaabbbbababbbaabbbaaabbababaababbbbbaaabbbabbabaaaababbbaabaaaabbbabaaabbb...
output:
result:
Subtask #4:
score: 0
Time Limit Exceeded
Test #17:
score: 30
Accepted
time: 566ms
memory: 12204kb
input:
100 1000 bcbccabbbabacabaabbccbaaabbbbcbbbaaaacaaabbccbababbacbbabbbaccccccccbccabcaacbbccbbbbcaaacabcccaccbaacccbcbaaaccbcaaaaaaaabccaaaacccbabacbcababbacbbbcaabaaacbbcaccbaccccbbcbacabaacbcaccacbcbcbbcbccccbbcacccaabbabcaabbacabaaacccbbcbccbabbcbccbcbbbabbaabacbccbacababbacbababbbaacccacbabcabcaba...
output:
833103
result:
ok single line: '833103'
Test #18:
score: 0
Time Limit Exceeded
input:
1000 1000 cacccababcaaccbaaabcbcabcbbccbcbcbbcacbbcabcaaccabcccaacabccaacaaaababbbbbcbbcbcbbbcacbaabccaccbaacaaacabbbcbcbaabbcccacaababbbabcaabbaabaabaabaabccaacccbabcbaacccbbbccaacbbacacacaacccbcbcbaccbccaaacabaacbcbaacbcbacaccbacbbcaccbabbbabbbaccccbbbcacccccaacbbaaaccacabaaacaccabacacbaaaaacbacab...