QOJ.ac
QOJ
ID | 题目 | 提交者 | 结果 | 用时 | 内存 | 语言 | 文件大小 | 提交时间 | 测评时间 |
---|---|---|---|---|---|---|---|---|---|
#622570 | #7780. Dark LaTeX vs. Light LaTeX | Catreap | TL | 7ms | 107744kb | C++20 | 4.3kb | 2024-10-08 22:52:51 | 2024-10-08 22:52:51 |
Judging History
answer
#include <algorithm>
#include <cstdio>
#include <cstring>
#include <map>
#include <vector>
typedef long long ll;
const int N = 5005;
const int B1 = 7393, B2 = 2333;
const int M1 = 998244353, M2 = 1e9 + 7;
void build(char* str, int n, std::pair<int, int>* h) {
h[0] = {0, 0};
for (int i = 1; i <= n; i++) {
h[i].first = ((ll)h[i - 1].first * B1 + str[i]) % M1;
}
for (int i = 1; i <= n; i++) {
h[i].second = ((ll)h[i - 1].second * B2 + str[i]) % M2;
}
}
std::pair<int, int> calc(std::pair<int, int>* h, int l, int r) {
static int pow1[N], pow2[N];
if (!pow1[0]) {
pow1[0] = pow2[0] = 1;
for (int i = 1; i < N; i++) {
pow1[i] = (ll)pow1[i - 1] * B1 % M1;
}
for (int i = 1; i < N; i++) {
pow2[i] = (ll)pow2[i - 1] * B2 % M2;
}
}
return {((ll)h[r].first - (ll)h[l - 1].first * pow1[r - l + 1] % M1 + M1) % M1,
((ll)h[r].second - (ll)h[l - 1].second * pow2[r - l + 1] % M2 + M2) % M2};
}
void calcZ(char *s, int n, int *z) {
for (int i = 1, l = 0, r = 0; i < n; ++i) {
if (i <= r && z[i - l] < r - i + 1) {
z[i] = z[i - l];
} else {
z[i] = std::max(0, r - i + 1);
while (i + z[i] < n && s[z[i]] == s[i + z[i]])
++z[i];
}
if (i + z[i] - 1 > r)
l = i, r = i + z[i] - 1;
}
}
int main() {
static char s[N], t[N];
static int zs[N][N], zt[N][N];
static int sum[N][N];
std::map<std::pair<int, int>, int> mp_s, mp_t;
static std::pair<int, int> hs[N], ht[N];
scanf("%s%s", s + 1, t + 1);
int n = strlen(s + 1), m = strlen(t + 1);
build(s, n, hs);
build(t, m, ht);
ll ans = 0;
for (int i = 1; i <= n; i++) {
for (int j = i; j <= n; j++) {
mp_s[calc(hs, i, j)]++;
}
}
for (int i = 1; i <= m; i++) {
for (int j = i; j <= m; j++) {
mp_t[calc(ht, i, j)]++;
}
}
for (int i = 1; i <= n; i++) {
calcZ(s + i, n - i + 1, zs[i]);
// printf("zs[%d] = ", i);
for (int j = 2; i + j <= n; j++) {
if (zs[i][j]) {
sum[i + j - 1][i + 1]++;
sum[i + j - 1][std::min(i + j, i + zs[i][j] + 1)]--;
}
// printf("%d ", zs[i][j]);
}
// printf("\n");
}
for (int j = 2; j < n; j++) {
// printf("sum[%d] = ", j);
for (int i = 1; i <= n; i++) {
sum[j][i] += sum[j][i - 1];
// printf("%d ", sum[j][i]);
}
// printf("\n");
for (int i = 2; i <= j; i++) {
auto it = mp_t.find(calc(hs, i, j));
if (it != mp_t.end()) {
ans += (ll)sum[j][i] * (it->second);
}
}
// printf("ans = %d\n", ans);
}
for (int i = 1; i <= n; i++) {
for (int j = i; j <= n; j++) {
auto it = mp_t.find(calc(hs, i, j));
if (it != mp_t.end()) {
ans += it->second;
}
}
}
// printf("ans = %d\n", ans);
memset(sum, 0, sizeof(sum));
for (int i = 1; i <= m; i++) {
calcZ(t + i, m - i + 1, zt[i]);
// printf("zt[%d] = ", i);
for (int j = 2; i + j <= m; j++) {
if (zt[i][j]) {
sum[i + j - 1][i + 1]++;
sum[i + j - 1][std::min(i + j, i + zt[i][j] + 1)]--;
}
// printf("%d ", zt[i][j]);
}
// printf("\n");
}
for (int j = 2; j < m; j++) {
// printf("sum[%d] = ", j);
for (int i = 1; i <= m; i++) {
sum[j][i] += sum[j][i - 1];
// printf("%d ", sum[j][i]);
}
// printf("\n");
for (int i = 2; i <= j; i++) {
auto it = mp_s.find(calc(ht, i, j));
if (it != mp_s.end()) {
ans += (ll)sum[j][i] * (it->second);
}
}
// printf("ans = %d\n", ans);
}
printf("%lld\n", ans);
return 0;
}
/*
abab
abaaab
zs[1] = 0 2 0
zs[2] = 0 1
zs[3] = 0
zs[4] =
zt[1] = 0 1 1 2 0
zt[2] = 0 0 0 1
zt[3] = 2 1 0
zt[4] = 1 0
zt[5] = 0
zt[6] =
*/
详细
Test #1:
score: 100
Accepted
time: 7ms
memory: 104004kb
input:
abab ab
output:
8
result:
ok 1 number(s): "8"
Test #2:
score: 0
Accepted
time: 0ms
memory: 105540kb
input:
abab abaaab
output:
29
result:
ok 1 number(s): "29"
Test #3:
score: 0
Accepted
time: 4ms
memory: 107744kb
input:
abcd abcde
output:
10
result:
ok 1 number(s): "10"
Test #4:
score: 0
Accepted
time: 4ms
memory: 106888kb
input:
aaba ba
output:
6
result:
ok 1 number(s): "6"
Test #5:
score: 0
Accepted
time: 0ms
memory: 104492kb
input:
babababaaabbaabababbbaabbbababbaaaaa aaaabbaababbab
output:
1161
result:
ok 1 number(s): "1161"
Test #6:
score: -100
Time Limit Exceeded
input:
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa...