QOJ.ac
QOJ
ID | Problem | Submitter | Result | Time | Memory | Language | File size | Submit time | Judge time |
---|---|---|---|---|---|---|---|---|---|
#302834 | #7780. Dark LaTeX vs. Light LaTeX | ucup-team173# | WA | 22ms | 107004kb | C++17 | 2.9kb | 2024-01-11 13:55:36 | 2024-01-11 13:55:36 |
Judging History
answer
#include <bits/stdc++.h>
using namespace std;
#define fi first
#define se second
#define pb push_back
#define Mp make_pair
#define SZ(x) (int((x).size()))
typedef long long ll;
typedef double db;
typedef vector<int> vi;
typedef pair<int, int> pii;
const int MAXN = 5005, Mod1 = 998244353, Mod2 = 1e9 + 7, base = 131;
string S, T;
int n, m;
struct Hash{
int val1, val2;
Hash(int val = 0) : val1(val), val2(val) {}
Hash(int val1, int val2) : val1(val1), val2(val2) {}
};
Hash operator + (Hash a, Hash b) {
return Hash((a.val1 + b.val1) % Mod1, (a.val2 + b.val2) % Mod2);
}
Hash operator * (Hash a, Hash b) {
return Hash(1ll * a.val1 * b.val1 % Mod1, 1ll * a.val2 * b.val2 % Mod2);
}
long long get(Hash t) {
return 1ll * t.val1 * Mod2 + t.val2;
}
unordered_map<ll, int> cntS, cntT;
int lcp[MAXN][MAXN], f[MAXN][MAXN];
int sum[MAXN][MAXN];
void solve() {
cin >> S >> T;
n = S.size(), m = T.size();
for(int i = 0; i < n; i++) {
Hash now = 0;
for(int j = i; j < n; j++) {
now = now * base + S[j], cntS[get(now)]++;
}
}
for(int i = 0; i < m; i++) {
Hash now = 0;
for(int j = i; j < m; j++) {
now = now * base + T[j], cntT[get(now)]++;
}
}
ll ans = 0;
for(int i = 0; i < n; i++) {
Hash now = 0;
for(int j = i; j < n; j++) {
now = now * base + S[j], f[i][j] = cntT[get(now)];
ans += f[i][j];
}
}
for(int i = 0; i < n; i++) for(int j = 0; j < n; j++)
sum[i][j] = (i == 0 ? 0 : sum[i - 1][j]) + f[i][j];
// cout << ans << '\n';
memset(lcp, 0, sizeof(lcp));
for(int l = n - 1; l >= 0; l--) {
for(int r = l + 1; r < n; r++) {
if(S[l] == S[r]) lcp[l][r] = lcp[l + 1][r + 1] + 1; else lcp[l][r] = 0;
if(lcp[l][r] > 0) {
// cout << l << ' ' << r << ' ' << lcp[l][r] << '\n';
// cout << sum[l + lcp[l][r]][r - 1] << ' ' << sum[l][r - 1] << '\n';
ans += sum[l + lcp[l][r]][r - 1] - sum[l][r - 1];
}
}
}
for(int i = 0; i < m; i++) {
Hash now = 0;
for(int j = i; j < m; j++) {
now = now * base + T[j], f[i][j] = cntS[get(now)];
}
}
for(int i = 0; i < m; i++) for(int j = 0; j < m; j++)
sum[i][j] = (i == 0 ? 0 : sum[i - 1][j]) + f[i][j];
memset(lcp, 0, sizeof(lcp));
for(int l = m - 1; l >= 0; l--) {
for(int r = l + 1; r < m; r++) {
if(T[l] == T[r]) lcp[l][r] = lcp[l][r + 1] + 1; else lcp[l][r] = 0;
if(lcp[l][r] > 0) ans += sum[l + lcp[l][r]][r - 1] - sum[l][r - 1];
}
}
cout << ans << '\n';
}
signed main() {
ios::sync_with_stdio(false), cin.tie(0), cout.tie(0);
int t = 1;
// cin >> t;
while(t--) solve();
return 0;
}
Details
Tip: Click on the bar to expand more detailed information
Test #1:
score: 100
Accepted
time: 7ms
memory: 105456kb
input:
abab ab
output:
8
result:
ok 1 number(s): "8"
Test #2:
score: 0
Accepted
time: 8ms
memory: 106572kb
input:
abab abaaab
output:
29
result:
ok 1 number(s): "29"
Test #3:
score: 0
Accepted
time: 12ms
memory: 107004kb
input:
abcd abcde
output:
10
result:
ok 1 number(s): "10"
Test #4:
score: 0
Accepted
time: 22ms
memory: 105372kb
input:
aaba ba
output:
6
result:
ok 1 number(s): "6"
Test #5:
score: -100
Wrong Answer
time: 8ms
memory: 103836kb
input:
babababaaabbaabababbbaabbbababbaaaaa aaaabbaababbab
output:
1037
result:
wrong answer 1st numbers differ - expected: '1161', found: '1037'