QOJ.ac
QOJ
ID | 题目 | 提交者 | 结果 | 用时 | 内存 | 语言 | 文件大小 | 提交时间 | 测评时间 |
---|---|---|---|---|---|---|---|---|---|
#371972 | #7780. Dark LaTeX vs. Light LaTeX | comeintocalm | TL | 562ms | 70996kb | C++17 | 2.7kb | 2024-03-30 18:48:52 | 2024-03-30 18:48:53 |
Judging History
answer
#include <bits/stdc++.h>
const long long P = 1e15 + 37;
std::unordered_map<unsigned long long, int> mp;
int f[5005][5005];
auto GetNext(std::string &s, const int n) -> std::pair<std::vector<int>, std::vector<int>> {
std::vector<int> nxt(n);
std::vector<int> d(n, 1);
nxt[0] = -1;
for (int i = 1, j = -1; i < n; ++i) {
while (~j && s[i] != s[j + 1])
j = nxt[j];
if (s[i] == s[j + 1])
++j;
nxt[i] = j;
if (~j) {
d[i] = d[j] + 1;
}
}
return {nxt, d};
}
void GetMap(std::string &s, std::string &t) {
int n = (int)s.length();
int m = (int)t.length();
for (int i = 0; i < m; ++i) {
unsigned long long ha = 0;
for (int j = i; j < m; ++j) {
ha = (137ull * ha + (t[j] - 'a' + 1));
++mp[ha];
}
}
for (int i = 0; i < n; ++i) {
unsigned long long ha = 0;
for (int j = i; j < n; ++j) {
ha = (137ull * ha + (s[j] - 'a' + 1));
auto it = mp.find(ha);
if (it != mp.end()) {
f[i][j] = it->second;
} else {
f[i][j] = 0;
}
}
}
}
auto calc(std::string &s) -> long long {
int n = (int)s.length();
long long ret = 0;
std::vector<unsigned long long> base(n);
base[0] = 1;
for (int i = 1; i < n; ++i)
base[i] = 137ull * base[i - 1];
for (int R = 0; R + 1 < n; ++R) {
auto o = std::move(s.substr(R + 1, n));
auto [nxt, dep] = std::move(GetNext(o, n - R));
std::vector<int> d(R + 1);
for (int i = 0, j = -1; i < R; ++i) {
while (~j && (s[i] != o[j + 1] || j + 1 >= n - R)) {
j = nxt[j];
}
if (s[i] == o[j + 1])
++j;
if (~j) {
// printf("i: %d R: %d j: %d\n", i, R, j);
d[i] = dep[j];
}
}
for (int i = R; i > 0; --i) {
ret += 1ll * f[i][R] * d[i - 1];
// printf("hash %d i:%d d[i-1]: %d\n", ha, i, d[i - 1]);
}
}
return ret;
}
auto qwq(std::string &s) -> long long {
int n = (int)s.length();
long long ret = 0;
for (int i = 0; i < n; ++i) {
for (int j = i; j < n; ++j) {
ret += f[i][j];
}
}
return ret;
}
int main() {
// freopen("d.in", "r", stdin);
// freopen("d.out", "w", stdout);
std::string s, t;
std::cin >> s >> t;
GetMap(s, t);
long long ans = qwq(s);
ans += calc(s);
mp.clear();
GetMap(t, s);
ans += calc(t);
// std::cout << calc(s, t) << ' ' << calc(t, s) << ' ' << qwq(s, t) << std::endl;
std::cout << ans << std::endl;
return 0;
}
詳細信息
Test #1:
score: 100
Accepted
time: 0ms
memory: 3584kb
input:
abab ab
output:
8
result:
ok 1 number(s): "8"
Test #2:
score: 0
Accepted
time: 0ms
memory: 3552kb
input:
abab abaaab
output:
29
result:
ok 1 number(s): "29"
Test #3:
score: 0
Accepted
time: 0ms
memory: 3544kb
input:
abcd abcde
output:
10
result:
ok 1 number(s): "10"
Test #4:
score: 0
Accepted
time: 0ms
memory: 3760kb
input:
aaba ba
output:
6
result:
ok 1 number(s): "6"
Test #5:
score: 0
Accepted
time: 1ms
memory: 3744kb
input:
babababaaabbaabababbbaabbbababbaaaaa aaaabbaababbab
output:
1161
result:
ok 1 number(s): "1161"
Test #6:
score: 0
Accepted
time: 562ms
memory: 70996kb
input:
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa...
output:
78156256250000
result:
ok 1 number(s): "78156256250000"
Test #7:
score: 0
Accepted
time: 87ms
memory: 19356kb
input:
gzgzggzgzggzggzgzggzgzggzggzgzggzggzgzggzgzggzggzgzggzggzgzggzgzggzggzgzggzgzggzggzgzggzggzgzggzgzggzggzgzggzgzggzggzgzggzggzgzggzgzggzggzgzggzggzgzggzgzggzggzgzggzgzggzggzgzggzggzgzggzgzggzggzgzggzggzgzggzgzggzggzgzggzgzggzggzgzggzggzgzggzgzggzggzgzggzgzggzggzgzggzggzgzggzgzggzggzgzggzggzgzggzgzggz...
output:
60716448
result:
ok 1 number(s): "60716448"
Test #8:
score: 0
Accepted
time: 75ms
memory: 19532kb
input:
mlmllmllmlmllmlmllmllmlmllmlmllmllmlmllmllmlmllmlmllmllmlmllmlmllmllmlmllmllmlmllmlmllmllmlmllmllmlmllmlmllmllmlmllmlmllmllmlmllmllmlmllmlmllmllmlmllmllmlmllmlmllmllmlmllmlmllmllmlmllmllmlmllmlmllmllmlmllmlmllmllmlmllmllmlmllmlmllmllmlmllmllmlmllmlmllmllmlmllmlmllmllmlmllmllmlmllmlmllmllmlmllmlmllml...
output:
60679828
result:
ok 1 number(s): "60679828"
Test #9:
score: -100
Time Limit Exceeded
input:
vbvbbvbvbbvbbvbvbbvbvbbvbbvbvbbvbbvbvbbvbvbbvbbvbvbbvbbvbvbbvbvbbvbbvbvbbvbvbbvbbvbvbbvbbvbvbbvbvbbvbbvbvbbvbbvbvbbvbvbbvbbvbvbbvbvbbvbbvbvbbvbbvbvbbvbvbbvbbvbvbbvbvbbvbbvbvbbvbbvbvbbvbvbbvbbvbvbbvbbvbvbbvbvbbvbbvbvbbvbvbbvbbvbvbbvbbvbvbbvbvbbvbbvbvbbvbvbbvbbvbvbbvbbvbvbbvbvbbvbbvbvbbvbbvbvbbvbvbbvb...