QOJ.ac
QOJ
ID | 题目 | 提交者 | 结果 | 用时 | 内存 | 语言 | 文件大小 | 提交时间 | 测评时间 |
---|---|---|---|---|---|---|---|---|---|
#618844 | #7780. Dark LaTeX vs. Light LaTeX | TJUHuangTao | TL | 16ms | 286008kb | C++20 | 3.1kb | 2024-10-07 10:55:11 | 2024-10-07 10:55:12 |
Judging History
answer
#include <bits/stdc++.h>
#define int long long
#define ll long long
#define ull unsigned long long
#define db double
#define i128 __int128_t
#define pii pair<int, int>
using namespace std;
const int maxn = 6e3 + 10;
struct exKMP {
int z[maxn];
void get_z(string& c) {
int len = c.length();
int p = 0, k = 1, l;
z[0] = len;
while (p + 1 < len && c[p] == c[p + 1])
p++;
z[1] = p;
for (int i = 2; i < len; i++) {
p = k + z[k] - 1;
l = z[i - k];
if (i + l <= p)
z[i] = l;
else {
int j = max(0ll, p - i + 1);
while (i + j < len && c[i + j] == c[j])
j++;
z[i] = j;
k = i;
}
}
}
} Z;
map<ull, int> mps, mpt;
const ull mod = (1ull << 61) - 1;
const ull base = 131;
ull add(ull a, ull b) {
a += b;
if (a >= mod)
a -= mod;
return a;
}
ull mul(ull a, ull b) {
__uint128_t c = __uint128_t(a) * b;
return add(c >> 61, c & mod);
}
ull mi[maxn];
ull h1[maxn], h2[maxn];
ull get_hash(ull h[], int l, int r) {
return add(h[r], mod - mul(h[l - 1], mi[r - l + 1]));
}
int sub[maxn][maxn];
int cal(string s, string t, int id) {
int n = s.length(), m = t.length();
int ans = 0;
if (id == 0) {
for (int i = 1; i <= n; i++)
h1[i] = add(mul(h1[i - 1], base), s[i - 1]);
for (int i = 1; i <= m; i++)
h2[i] = add(mul(h2[i - 1], base), t[i - 1]);
for (int i = 1; i <= n; i++)
for (int j = i; j <= n; j++)
mps[get_hash(h1, i, j)]++;
for (int i = 1; i <= m; i++)
for (int j = i; j <= m; j++)
mpt[get_hash(h2, i, j)]++;
for (auto it : mps)
ans += it.second * mpt[it.first];
}
// cout << "same" << ans << endl;
for (int i = 1; i <= n; i++) {
string str2 = s.substr(i - 1);
Z.get_z(str2);
for (int j = 3; j <= str2.length(); j++) {
int mxlen = min(Z.z[j - 1], j - 1);
if (!mxlen)
continue;
// 右端点在 j - 1, 左端点在 2 到 mxlen + 1
sub[i - 1 + j - 1][i - 1 + 2]++;
sub[i - 1 + j - 1][i - 1 + mxlen + 1 + 1]--;
}
}
for (int i = 1; i <= n; i++)
for (int j = 1; j <= i; j++) {
sub[i][j] += sub[i][j - 1];
if (sub[i][j] > 0) {
ans += sub[i][j] * mpt[get_hash(h1, j, i)];
// cout << "l, r = " << j << " " << i << endl;
}
}
return ans;
}
signed main() {
ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
mi[0] = 1;
for (int i = 1; i < maxn; i++)
mi[i] = mul(mi[i - 1], base);
string s, t;
cin >> s >> t;
int res = cal(s, t, 0);
memset(sub, 0, sizeof sub);
swap(mps, mpt);
for (int i = 1; i <= max(s.length(), t.length()); i++)
swap(h1[i], h2[i]);
res += cal(t, s, 1);
cout << res << endl;
return 0;
}
詳細信息
Test #1:
score: 100
Accepted
time: 0ms
memory: 285792kb
input:
abab ab
output:
8
result:
ok 1 number(s): "8"
Test #2:
score: 0
Accepted
time: 11ms
memory: 286008kb
input:
abab abaaab
output:
29
result:
ok 1 number(s): "29"
Test #3:
score: 0
Accepted
time: 8ms
memory: 285820kb
input:
abcd abcde
output:
10
result:
ok 1 number(s): "10"
Test #4:
score: 0
Accepted
time: 11ms
memory: 285824kb
input:
aaba ba
output:
6
result:
ok 1 number(s): "6"
Test #5:
score: 0
Accepted
time: 16ms
memory: 285868kb
input:
babababaaabbaabababbbaabbbababbaaaaa aaaabbaababbab
output:
1161
result:
ok 1 number(s): "1161"
Test #6:
score: -100
Time Limit Exceeded
input:
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa...