QOJ.ac
QOJ
ID | 题目 | 提交者 | 结果 | 用时 | 内存 | 语言 | 文件大小 | 提交时间 | 测评时间 |
---|---|---|---|---|---|---|---|---|---|
#283016 | #7780. Dark LaTeX vs. Light LaTeX | Loging# | WA | 2ms | 12252kb | C++20 | 5.5kb | 2023-12-13 18:01:52 | 2023-12-13 18:01:53 |
Judging History
answer
#include <bits/stdc++.h>
using namespace std;
const int N = 5000 + 5;
string S , T;
vector<vector<int>> solve(const string &a , const string &b , int n , int m) {
vector<vector<int>> f(n + 2 , vector<int>(m + 2));
for (int i = n ; i >= 1 ; i--) {
for (int j = m ; j >= 1 ; j--) {
if (a[i] == b[j]) {
f[i][j] = f[i + 1][j + 1] + 1;
} else {
f[i][j] = 0;
}
}
}
return f;
}
const int M = 20000 + 5;
int cnt = 1;
int len[M] , fa[M] , pa[N] , pb[N] , son[M][26];
long long sa[M] , sb[M] , va[M] , vb[M];
vector<int> G[M];
int extend(int c , int last) {
if (son[last][c]) {
int p = last , q = son[p][c];
if (len[p] + 1 == len[q]) return q;
else {
int nq = ++cnt; len[nq] = len[p] + 1;
copy(son[q] , son[q] + 26 , son[nq]);
fa[nq] = fa[q] , fa[q] = nq;
for ( ; son[p][c] == q ; p = fa[p]) son[p][c] = nq;
return nq;
}
}
int np = ++cnt , p = last;
last = np , len[np] = len[p] + 1;
for ( ; p and not son[p][c] ; p = fa[p]) son[p][c] = np;
if (p == 0) fa[np] = 1;
else {
int q = son[p][c];
if (len[q] == len[p] + 1) fa[np] = q;
else {
int nq = ++cnt; len[nq] = len[p] + 1;
copy(son[q] , son[q] + 26 , son[nq]);
fa[nq] = fa[q] , fa[np] = fa[q] = nq;
for ( ; son[p][c] == q ; p = fa[p]) son[p][c] = nq;
}
}
return np;
}
void dfs(int u) {
for (int v : G[u]) {
dfs(v);
sa[u] += sa[v];
sb[u] += sb[v];
}
}
void dfs1(int u) {
long long wa = 0 , wb = 0;
if (sa[u]) wa = 1ll * (len[u] - len[fa[u]]) * sa[u];
if (sb[u]) wb = 1ll * (len[u] - len[fa[u]]) * sb[u];
for (int v : G[u]) {
va[v] += va[u] + wa;
vb[v] += vb[u] + wb;
dfs1(v);
}
}
int ja[N][N] , jb[N][N];
void debug(int u , string s) {
cout << u << ' ' << s << ' ' << fa[u] << ' ' << len[u] << ' ' << va[u] << ' ' << vb[u] << ' ' << sa[u] << ' ' << sb[u] << endl;
for (int i = 0 ; i < 26 ; i++) {
if (son[u][i]) {
debug(son[u][i] , s + (char)('a' + i));
}
}
}
int main() {
cin.tie(nullptr)->sync_with_stdio(0);
cin >> S >> T;
int n = S.size() , m = T.size() + 1;
S = ' ' + S;
T = ' ' + T;
auto f = solve(S , S , n , n);
auto h = solve(S , T , n , m);
long long ans = 0;
for (int i = 1 ; i <= n ; i++) {
for (int j = 1 ; j <= m ; j++) {
ans += h[i][j];
}
}
// cout << "INIT" << ans << endl;
int last = 1;
for (int i = 1 ; i <= n ; i++) {
last = extend(S[i] - 'a' , last);
pa[i] = last , sa[last]++;
}
last = 1;
for (int i = 1 ; i <= m ; i++) {
last = extend(T[i] - 'a' , last);
pb[i] = last , sb[last]++;
}
for (int i = cnt ; i > 1 ; i--) {
G[fa[i]].push_back(i);
}
dfs(1) , dfs1(1);
// debug(1 , "");
for (int i = 1 ; i <= n ; i++) {
int p = pa[i] , l = i , j = 0;
ja[i][j] = p;
while (l) {
--l , ++j;
if (l == len[fa[p]]) p = fa[p];
ja[i][j] = p;
// cout << i << ' ' << j << ' ' << l << ' ' << p << endl;
}
}
// for (int i = 1 ; i <= m ; i++) {
// int p = pb[i] , l = i , j = 0;
// while (l) {
// --l , ++j;
// if (l == len[fa[p]]) p = fa[p];
// jb[i][j] = p;
// cout << i << ' ' << j << ' ' << l << ' ' << p << endl;
// }
// }
auto solvea = [&](int u , int L) {
// cout << u << ":" << L << ' ' << len[fa[u]] << ' ' << fa[u] << ' ' << sa[u] << endl;
if (u == 1) return 0ll;
long long ret = va[u];
if (sa[u]) ret += 1ll * (L - len[fa[u]]) * sa[u];
return ret;
};
auto solveb = [&](int u , int L) {
// cout << u << ":" << L << endl;
if (u == 1) return 0ll;
long long ret = vb[u];
if (sb[u]) ret += 1ll * (L - len[fa[u]]) * sb[u];
return ret;
};
// cout << ans << endl;
for (int i = 1 ; i <= n ; i++) {
for (int j = i + 2 ; j <= n ; j++) {
int l = f[i][j];
if (l == 0) continue;
// cout << i << ' ' << j << ' ' << l << endl;
int L = i + 1 , R = min(i + f[i][j] - 1 , j - 1);
int p = ja[j - 1][i] , q = ja[j - 1][R + 1];
// cout << i << ' ' << j << ' ' << p << ' ' << q << endl;
ans += solveb(p , j - 1 - i) - solveb(q , j - 1 - R);
}
}
// cout << ans << endl;
reverse(S.begin() + 1 , S.end());
reverse(T.begin() + 1 , T.end());
auto g = solve(T , T , m , m);
for (int i = 1 ; i <= cnt ; i++) {
G[i].clear();
}
cnt = 1 , last = 1;
memset(fa , 0 , sizeof fa);
memset(son , 0 , sizeof son);
memset(sa , 0 , sizeof sa);
memset(sb , 0 , sizeof sb);
memset(va , 0 , sizeof va);
memset(vb , 0 , sizeof vb);
last = 1;
for (int i = 1 ; i <= n ; i++) {
last = extend(S[i] - 'a' , last);
pa[i] = last , sa[last]++;
}
last = 1;
for (int i = 1 ; i <= m ; i++) {
last = extend(T[i] - 'a' , last);
pb[i] = last , sb[last]++;
}
for (int i = cnt ; i > 1 ; i--) {
G[fa[i]].push_back(i);
}
dfs(1) , dfs1(1);
// debug(1 , "");
for (int i = 1 ; i <= m ; i++) {
int p = pb[i] , l = i , j = 0;
jb[i][j] = p;
while (l) {
--l , ++j;
if (l == len[fa[p]]) p = fa[p];
jb[i][j] = p;
// cout << i << ' ' << j << ' ' << l << ' ' << p << endl;
}
}
// swap(S , T);
// cout << S << ' ' << T << endl;
for (int i = 1 ; i <= m ; i++) {
for (int j = i + 2 ; j <= m ; j++) {
int l = g[i][j];
if (l == 0) continue;
// cout << i << ' ' << j << ' ' << l << endl;
int L = i + 1 , R = min(i + g[i][j] - 1 , j - 1);
int p = jb[j - 1][i] , q = jb[j - 1][R + 1];
// cout << i << ' ' << j << ' ' << p << ' ' << q << endl;
// cout << solvea(p , j - 1 - i) - solvea(q , j - 1 - R - 1) << endl;;
ans += solvea(p , j - 1 - i) - solvea(q , j - 1 - R - 1);
}
}
cout << ans << '\n';
return 0;
}
详细
Test #1:
score: 100
Accepted
time: 0ms
memory: 12252kb
input:
abab ab
output:
8
result:
ok 1 number(s): "8"
Test #2:
score: 0
Accepted
time: 0ms
memory: 12044kb
input:
abab abaaab
output:
29
result:
ok 1 number(s): "29"
Test #3:
score: 0
Accepted
time: 2ms
memory: 9956kb
input:
abcd abcde
output:
10
result:
ok 1 number(s): "10"
Test #4:
score: -100
Wrong Answer
time: 1ms
memory: 9520kb
input:
aaba ba
output:
5
result:
wrong answer 1st numbers differ - expected: '6', found: '5'