QOJ.ac
QOJ
ID | 题目 | 提交者 | 结果 | 用时 | 内存 | 语言 | 文件大小 | 提交时间 | 测评时间 |
---|---|---|---|---|---|---|---|---|---|
#622491 | #7780. Dark LaTeX vs. Light LaTeX | Palbudir | WA | 635ms | 408464kb | C++20 | 4.0kb | 2024-10-08 22:07:20 | 2024-10-08 22:07:21 |
Judging History
answer
#include <bits/stdc++.h>
#include <vector>
using i80 = __int128;
using i64 = long long;
using f80 = long double;
constexpr const int N = 5050;
constexpr const int P = 503;
constexpr const int mod = 7654337;
void work() {
std::vector<int> pk(N);
pk[0] = 1;
for (int i = 1; i < N; ++i) {
pk[i] = 1ll * pk[i - 1] * P % mod;
}
std::string s, t;
std::cin >> s >> t;
int n = s.size(), m = t.size();
std::vector cs(n + 1, std::vector<int>(n + 1, 1)), ct(m + 1, std::vector<int>(m + 1, 1));
std::vector<int> pis(std::max(n, m) + 1), val(std::max(n, m) + 1);
auto make = [&](std::string str) {
int k = str.size();
// std::cout << str << ":";
for (int i = 1, j = 0; i < k; ++i) {
while (j && str[j] != str[i]) {
j = pis[j - 1];
}
if (str[i] == str[j]) {
++j;
}
if (j) {
val[i] = val[j - 1] + 1;
} else {
val[i] = 0;
}
pis[i] = j;
// std::cout << pis[i] << "," << val[i] << ";\n"[i == k - 1];
}
};
std::string ss = '|' + s, tt = '|' + t;
for (int i = n; i; --i) {
make(ss);
for (int j = n - i; j <= n; ++j) {
cs[j - n + i][i] += val[j];
}
ss = s[i - 1] + ss;
ss.pop_back();
}
for (int i = m; i; --i) {
make(tt);
for (int j = m - i; j <= m; ++j) {
ct[j - m + i][i] += val[j];
}
tt = t[i - 1] + tt;
tt.pop_back();
}
std::vector<int> ps(n + 1), pt(m + 1);
for (int i = 0; i < n; ++i) {
ps[i + 1] = (1ll * ps[i] * P + s[i] - 'a' + 1) % mod;
}
for (int i = 0; i < m; ++i) {
pt[i + 1] = (1ll * pt[i] * P + t[i] - 'a' + 1) % mod;
}
auto makes = [&](int l, int r) { return (ps[r] - 1ll * ps[l] * pk[r - l] % mod + mod) % mod; };
auto maket = [&](int l, int r) { return (pt[r] - 1ll * pt[l] * pk[r - l] % mod + mod) % mod; };
std::vector<int> map(mod);
int res;
std::vector<int> ms(mod), mt(mod), to;
std::vector<int> as(mod), bs(mod), at(mod), bt(mod);
i64 ans = 0;
for (int k = 1; k <= std::max(n, m); ++k) {
to.clear();
for (int l = 0; l + k <= n; ++l) {
int r = l + k;
// std::cout << l << "," << r << ":" << cs[l][r] << "\n";
res = makes(l, r);
if (ms[res] == k) {
as[res] += 1;
bs[res] += cs[l][r];
} else {
ms[res] = k;
as[res] = 1;
bs[res] = cs[l][r];
}
if (map[res] != k) {
map[res] = k;
to.push_back(res);
}
}
for (int l = 0; l + k <= m; ++l) {
int r = l + k;
res = maket(l, r);
if (mt[res] == k) {
at[res] += 1;
bt[res] += ct[l][r];
} else {
mt[res] = k;
at[res] = 1;
bt[res] = ct[l][r];
}
if (map[res] != k) {
map[res] = k;
to.push_back(res);
}
}
for (auto x : to) {
if (ms[x] != k || mt[x] != k) {
continue;
}
// std::cout << k << ":" << x << "|" << as[x] << "," << at[x] << ";" << bs[x] << "," << bt[x] << "|"
// << 1ll * as[x] * bt[x] + 1ll * bs[x] * at[x] - 1ll * as[x] * at[x] << "\n";
ans += 1ll * as[x] * bt[x] + 1ll * bs[x] * at[x] - 1ll * as[x] * at[x];
}
}
std::cout << ans << "\n";
return;
}
void init() {
}
int main() {
init();
std::ios::sync_with_stdio(false);
// std::cin.tie(nullptr), std::cout.tie(nullptr);
int t = 1;
// std::cin >> t;
while (t--) {
work();
}
return 0;
}
/*
*/
详细
Test #1:
score: 100
Accepted
time: 8ms
memory: 212512kb
input:
abab ab
output:
8
result:
ok 1 number(s): "8"
Test #2:
score: 0
Accepted
time: 25ms
memory: 212632kb
input:
abab abaaab
output:
29
result:
ok 1 number(s): "29"
Test #3:
score: 0
Accepted
time: 0ms
memory: 212824kb
input:
abcd abcde
output:
10
result:
ok 1 number(s): "10"
Test #4:
score: 0
Accepted
time: 11ms
memory: 212560kb
input:
aaba ba
output:
6
result:
ok 1 number(s): "6"
Test #5:
score: 0
Accepted
time: 7ms
memory: 212700kb
input:
babababaaabbaabababbbaabbbababbaaaaa aaaabbaababbab
output:
1161
result:
ok 1 number(s): "1161"
Test #6:
score: 0
Accepted
time: 635ms
memory: 408464kb
input:
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa...
output:
78156256250000
result:
ok 1 number(s): "78156256250000"
Test #7:
score: -100
Wrong Answer
time: 60ms
memory: 220540kb
input:
gzgzggzgzggzggzgzggzgzggzggzgzggzggzgzggzgzggzggzgzggzggzgzggzgzggzggzgzggzgzggzggzgzggzggzgzggzgzggzggzgzggzgzggzggzgzggzggzgzggzgzggzggzgzggzggzgzggzgzggzggzgzggzgzggzggzgzggzggzgzggzgzggzggzgzggzggzgzggzgzggzggzgzggzgzggzggzgzggzggzgzggzgzggzggzgzggzgzggzggzgzggzggzgzggzgzggzggzgzggzggzgzggzgzggz...
output:
60716499
result:
wrong answer 1st numbers differ - expected: '60716448', found: '60716499'