QOJ.ac
QOJ
ID | Problem | Submitter | Result | Time | Memory | Language | File size | Submit time | Judge time |
---|---|---|---|---|---|---|---|---|---|
#371924 | #7780. Dark LaTeX vs. Light LaTeX | comeintocalm# | TL | 1ms | 3816kb | C++17 | 2.8kb | 2024-03-30 18:05:57 | 2024-03-30 18:05:58 |
Judging History
answer
#include <bits/stdc++.h>
const long long P = 1e15 + 37;
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};
}
auto calc(std::string &s, std::string &t) -> long long {
std::map<long long, int> mp;
int n = (int)s.length();
int m = (int)t.length();
for (int i = 0; i < m; ++i) {
long long ha = 0;
for (int j = i; j < m; ++j) {
ha = (137ll * ha + (t[j] - 'a' + 1)) % P;
++mp[ha];
}
}
long long ret = 0;
std::vector<long long> base(n);
base[0] = 1;
for (int i = 1; i < n; ++i)
base[i] = 137ll * base[i - 1] % P;
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];
}
}
long long ha = 0;
for (int i = R; i > 0; --i) {
ha = (ha + base[R - i] * (s[i] - 'a' + 1) % P) % P;
if (mp.find(ha) != mp.end()) {
ret += 1ll * mp[ha] * 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, std::string &t) -> long long {
std::map<long long, int> mp;
int n = (int)s.length();
int m = (int)t.length();
for (int i = 0; i < m; ++i) {
long long ha = 0;
for (int j = i; j < m; ++j) {
ha = (137ll * ha + (t[j] - 'a' + 1)) % P;
++mp[ha];
}
}
long long ret = 0;
for (int i = 0; i < n; ++i) {
long long ha = 0;
for (int j = i; j < n; ++j) {
ha = (137ll * ha + (s[j] - 'a' + 1)) % P;
if (mp.find(ha) != mp.end()) {
ret += mp[ha];
}
}
}
return ret;
}
int main() {
// freopen("d.in", "r", stdin);
// freopen("d.out", "w", stdout);
std::string s, t;
std::cin >> s >> t;
long long ans = qwq(s, t);
ans += calc(s, t);
ans += calc(t, s);
// std::cout << calc(s, t) << ' ' << calc(t, s) << ' ' << qwq(s, t) << std::endl;
std::cout << ans << std::endl;
return 0;
}
Details
Tip: Click on the bar to expand more detailed information
Test #1:
score: 100
Accepted
time: 1ms
memory: 3572kb
input:
abab ab
output:
8
result:
ok 1 number(s): "8"
Test #2:
score: 0
Accepted
time: 0ms
memory: 3556kb
input:
abab abaaab
output:
29
result:
ok 1 number(s): "29"
Test #3:
score: 0
Accepted
time: 0ms
memory: 3816kb
input:
abcd abcde
output:
10
result:
ok 1 number(s): "10"
Test #4:
score: 0
Accepted
time: 0ms
memory: 3752kb
input:
aaba ba
output:
6
result:
ok 1 number(s): "6"
Test #5:
score: 0
Accepted
time: 0ms
memory: 3796kb
input:
babababaaabbaabababbbaabbbababbaaaaa aaaabbaababbab
output:
1161
result:
ok 1 number(s): "1161"
Test #6:
score: -100
Time Limit Exceeded
input:
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa...