QOJ.ac
QOJ
ID | Problem | Submitter | Result | Time | Memory | Language | File size | Submit time | Judge time |
---|---|---|---|---|---|---|---|---|---|
#631127 | #7780. Dark LaTeX vs. Light LaTeX | Hirro | WA | 1ms | 5672kb | C++20 | 2.7kb | 2024-10-11 22:09:54 | 2024-10-11 22:09:57 |
Judging History
answer
#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
const int maxn = 5005;
LL Ans;
int n, m, cnt;
int z[maxn], s[maxn][maxn];
int nxt[maxn];
char A[maxn], B[maxn];
void getlcp(char ss[], int id) {
int N = strlen(ss);
for (int i = 0; i <= n; i++) z[i] = 0;
for (int i = 1, l = 0, r = 0; i < N; ++i) {
if (i <= r && z[i - l + id] < r - i + 1)z[i + id] = z[i - l + id];
else {
z[i + id] = max(0, r - i + 1);
while (i + z[i + id] < n && ss[z[i + id]] == ss[i + z[i + id]]) ++z[i + id];
}
if (i + z[i + id] - 1 > r) l = i, r = i + z[i + id] - 1;
}
int i = id;
for (int j = i + 2; j <= n; j++) {
int t = z[j];
t = min(t, j - 1 - i);
s[i + 1][j - 1]++;
s[i + t + 1][j - 1]--;
}
}
int dp[maxn];
void cal(char b[], int id,int N) {
int pos = 0;
for (int i = 1; i <= n; i++) nxt[i] = 0;
for (int i = 0; i <= n; i++)dp[i] = 0;
for (int i = 2; i <= N; i++) {
while (pos && b[pos + 1] != b[i]) pos = nxt[pos];
if (b[pos + 1] == b[i]) pos++;
nxt[i] = pos;
}
int len = 0;
for (int i = 1; i <= m; i++) {
if (b[len + 1] != B[i])Ans += dp[len];
while (len && b[len + 1] != B[i])len = nxt[len];
if (b[len + 1] == B[i])len++;
dp[len] = nxt[dp[len]]+ s[id][id + len - 1] - s[id][id - 1];
}
Ans += dp[len];
}
void comm(char b[], int id, int N) {
int pos = 0;
for (int i = 1; i <= N; i++) nxt[i] = 0;
for (int i = 0; i <= n; i++)dp[i] = 0;
for (int i = 2; i <= N; i++) {
while (pos && b[pos + 1] != b[i]) pos = nxt[pos];
if (b[pos + 1] == b[i]) pos++;
nxt[i] = pos;
}
int len = 0;
for (int i = 1; i <= m; i++) {
if (b[len + 1] != B[i])Ans += dp[len];
while (len && b[len + 1] != B[i])len = nxt[len];
if (b[len + 1] == B[i]) len++;
dp[len] = nxt[dp[len]] + len;
}
Ans += dp[len];
}
void solve(string&a,string&b) {
n = a.size();m = b.size();
for (int i = 0; i <= n; i++)for (int j = 0; j <= n; j++)s[i][j] = 0;
for (int i = 0; i < a.size(); i++)A[i + 1] = a[i];
for (int i = 0; i < b.size(); i++)B[i + 1] = b[i];
A[n + 1] = '\0'; B[m + 1] = '\0';
for (int i = 1; i <= n; i++) getlcp(A + i, i);
for (int j = 1; j <= n; j++)for (int i = 1; i <= n; i++)s[i][j] += s[i - 1][j];
for (int i = 1; i <= n; i++)for (int j = 1; j <= n; j++)s[i][j] += s[i][j - 1];
for (int i = 1; i <= n; i++) cal(A + i-1, i,n-i+1);
}
int main() {
string a, b;
cin >> a >> b;
solve(a, b);
solve(b, a);
for (int i = 1; i <= n; i++) comm(A + i - 1, i,n-i+1);
cout << Ans << '\n';
return 0;
}
Details
Tip: Click on the bar to expand more detailed information
Test #1:
score: 100
Accepted
time: 0ms
memory: 3644kb
input:
abab ab
output:
8
result:
ok 1 number(s): "8"
Test #2:
score: 0
Accepted
time: 0ms
memory: 3884kb
input:
abab abaaab
output:
29
result:
ok 1 number(s): "29"
Test #3:
score: 0
Accepted
time: 0ms
memory: 3836kb
input:
abcd abcde
output:
10
result:
ok 1 number(s): "10"
Test #4:
score: 0
Accepted
time: 1ms
memory: 5672kb
input:
aaba ba
output:
6
result:
ok 1 number(s): "6"
Test #5:
score: -100
Wrong Answer
time: 0ms
memory: 3708kb
input:
babababaaabbaabababbbaabbbababbaaaaa aaaabbaababbab
output:
1058
result:
wrong answer 1st numbers differ - expected: '1161', found: '1058'