QOJ.ac
QOJ
ID | 题目 | 提交者 | 结果 | 用时 | 内存 | 语言 | 文件大小 | 提交时间 | 测评时间 |
---|---|---|---|---|---|---|---|---|---|
#768443 | #7780. Dark LaTeX vs. Light LaTeX | fosov | WA | 40ms | 203140kb | C++14 | 2.6kb | 2024-11-21 10:43:30 | 2024-11-21 10:43:30 |
Judging History
answer
#include <bits/stdc++.h>
using namespace std;
#define ll long long
#define lll __int128
#define INF 0x3f3f3f3f
#define LNF 0x3f3f3f3f3f3f3f3fll
#define MOD 998244353
#define pii pair<int, int>
#define pll pair<ll, ll>
#define ld long double
#define fi first
#define se second
#define all(a) a.begin(), a.end()
#define N 5050
int lcp[N][N]; // longest common prefix of s[i:] and s[j:]
int lcs[N][N]; // longest common suffix of s[:i] and t[:j]
int pre[N], sum[N];
ll go(string s, string t) {
memset(lcp, 0, sizeof lcp);
memset(lcs, 0, sizeof lcs);
int n = s.length(), m = t.length();
for (int i = n-1; i >= 0; -- i) {
for (int j = n-1; j >= 0; -- j) {
lcp[i][j] = s[i] != s[j] ? 0 : 1 + lcp[i+1][j+1];
}
}
for (int i = 1; i <= n; ++ i) {
for (int j = 1; j <= m; ++ j) {
lcs[i][j] = s[i-1] != t[j-1] ? 0 : 1 + lcs[i-1][j-1];
}
}
ll res = 0;
for (int r = 1; r < n; ++ r) {
pii x(1, 0);
memset(pre, 0, sizeof pre);
for (int j = 1; j <= m; ++ j) {
sum[lcs[r][j]] += lcs[r][j];
pre[lcs[r][j]] ++;
x.se = max(x.se, lcs[r][j]);
}
for (int j = N-2; j >= 0; -- j) {
sum[j] += sum[j+1];
pre[j] += pre[j+1];
}
if (x.fi > x.se) continue;
for (int l = 0; l < r; ++ l) {
int len = lcp[l][r];
pii y(r - l - len, r - l - 1);
if (y.fi > y.se) continue;
if (y.fi > x.se || y.se < x.fi) continue;
pii z(max(x.fi, y.fi), min(x.se, y.se));
ll di = 0;
di += sum[z.fi] - sum[z.se] - (pre[z.fi] - pre[z.se]) * (z.fi - 1);
di += pre[z.se] * (z.se - z.fi + 1);
res += di;
}
}
return res;
}
int main() {
#ifdef TEST
freopen("zz.in", "r+", stdin);
#endif
ios::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
string s, t; cin >> s >> t;
unordered_map<string, int> cnt;
ll res = 0;
for (int i = 0; i < t.length(); ++ i) {
string cur = "";
for (int j = i; j < t.length(); ++ j) {
cur += t[j];
cnt[cur] ++;
}
}
for (int i = 0; i < s.length(); ++ i) {
string cur = "";
for (int j = i; j < s.length(); ++ j) {
cur += s[j];
res += cnt[cur];
}
}
res += go(s, t) + go(t, s);
cout << res << '\n';
}
// sum - ksum <= 0
// sum - ksum > 0;
// sum > ksum
// aba-a
// a|b|a-b
// b|a|b-a
详细
Test #1:
score: 100
Accepted
time: 24ms
memory: 202856kb
input:
abab ab
output:
8
result:
ok 1 number(s): "8"
Test #2:
score: 0
Accepted
time: 24ms
memory: 202800kb
input:
abab abaaab
output:
29
result:
ok 1 number(s): "29"
Test #3:
score: 0
Accepted
time: 20ms
memory: 202952kb
input:
abcd abcde
output:
10
result:
ok 1 number(s): "10"
Test #4:
score: 0
Accepted
time: 40ms
memory: 202792kb
input:
aaba ba
output:
6
result:
ok 1 number(s): "6"
Test #5:
score: -100
Wrong Answer
time: 32ms
memory: 203140kb
input:
babababaaabbaabababbbaabbbababbaaaaa aaaabbaababbab
output:
1590714272
result:
wrong answer 1st numbers differ - expected: '1161', found: '1590714272'