QOJ.ac

QOJ

ID题目提交者结果用时内存语言文件大小提交时间测评时间
#631127#7780. Dark LaTeX vs. Light LaTeXHirroWA 1ms5672kbC++202.7kb2024-10-11 22:09:542024-10-11 22:09:57

Judging History

你现在查看的是最新测评结果

  • [2024-11-25 20:53:52]
  • hack成功,自动添加数据
  • (/hack/1258)
  • [2024-10-11 22:09:57]
  • 评测
  • 测评结果:WA
  • 用时:1ms
  • 内存:5672kb
  • [2024-10-11 22:09:54]
  • 提交

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;
}

詳細信息

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'