QOJ.ac
QOJ
ID | 题目 | 提交者 | 结果 | 用时 | 内存 | 语言 | 文件大小 | 提交时间 | 测评时间 |
---|---|---|---|---|---|---|---|---|---|
#628401 | #7780. Dark LaTeX vs. Light LaTeX | Hirro | ML | 2ms | 13880kb | C++20 | 3.2kb | 2024-10-10 20:00:53 | 2024-10-10 20:00:54 |
Judging History
answer
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N = 10005;
int ans = 0;
int lcp[N][N];
int n,m;
class SAM {
public:
vector<int> e[N >> 1];
int tot = 1, np = 1;
int fa[N >> 1], ch[N >> 1][27], len[N >> 1],cnt[N >> 1];
int F[N >> 1],s[N>>1],sp=0;
void extend(int c) {
int p = np; np = ++tot;
len[np] = len[p] + 1; cnt[np] = 1;
for (; p && !ch[p][c]; p = fa[p])ch[p][c] = np;
if (p == 0)fa[np] = 1;
else {
int q = ch[p][c];
if (len[q] == len[p] + 1)fa[np] = q;
else {
int nq = ++tot;
len[nq] = len[p] + 1;
fa[nq] = fa[q]; fa[q] = nq; fa[np] = nq;
for (; p && ch[p][c] == q; p = fa[p])ch[p][c] = nq;
memcpy(ch[nq], ch[q], sizeof(ch[q]));
}
}
}
void dfs(int u) {
for (auto& v : e[u]) {
dfs(v);
cnt[u] += cnt[v];
}
}
void create(string& a) {
for (int i = 0; i < (int)a.size(); i++)extend(a[i] - 'a');
for (int i = 2; i <= tot; i++)e[fa[i]].push_back(i);
for (int i = tot; i >= 1; i--)F[i] = i;
dfs(1);
}
int find(int u) {
if (u == F[u])return u;
return F[u] = find(F[u]);
}
void tarjan(int u) {
for (auto v : e[u]) {
tarjan(v);
F[v] = u;
}
if (e[u].size() == 0) {
for (int i = 1; i <= sp;i++)lcp[n - len[u] + 1][n - len[s[i]] + 1] = len[find(s[i])];
s[++sp] = u;
}
}
void init() {
for (int i = 1; i <= tot; i++) {
fa[i] = len[i]=cnt[i] = 0;
e[i].clear();
memset(ch[i], 0, sizeof(ch[i]));
}
tot = 1, np = 1;
sp = 0;
}
}SA, SB;
int cnt[N][N],cmo=0;
void solve(string a,string b) {
SA.init();
SB.init();
n = a.size(); m = b.size();
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
lcp[i][j] = 0;
cnt[i][j] = 0;
}
}
string t = a+'{';
reverse(t.begin(),t.end());
SA.create(t);
SB.create(b);
for (int i = 0; i < n; i++) {
int p = 1;
for (int j = i; j < n; j++) {
if (SB.ch[p][a[j] - 'a'])p = SB.ch[p][a[j] - 'a'];
else break;
cnt[i][j] = SB.cnt[p];
}
}
SA.tarjan(1);
for (int i = 0; i < n; i++)for (int j = i + 2; j < n; j++)lcp[i][j] = min(j - i - 1, max(lcp[i][j], lcp[j][i]));
if(!cmo)
for (int i = 0; i < n; i++) {
for (int j = i; j < n; j++) {
ans += cnt[i][j];
}
}
cmo = 1;
for (int j = 0; j < n; j++) {
for (int i = 1; i <= j; i++) {
cnt[i][j] += cnt[i - 1][j];
}
}
for (int i = 0; i < n; i++) {
for (int j = i + 2; j < n; j++) {//add i+1...j-1,i+2...j-1,..,i+lcp[i][j]-1...j-1
ans += cnt[i + lcp[i][j]][j - 1] - cnt[i][j - 1];
}
}
//cout << ans << '\n';
}
signed main() {
string a, b;
cin >> a>>b;
solve(a, b);
solve(b, a);
cout << ans << '\n';
return 0;
}
详细
Test #1:
score: 100
Accepted
time: 1ms
memory: 7708kb
input:
abab ab
output:
8
result:
ok 1 number(s): "8"
Test #2:
score: 0
Accepted
time: 2ms
memory: 11844kb
input:
abab abaaab
output:
29
result:
ok 1 number(s): "29"
Test #3:
score: 0
Accepted
time: 1ms
memory: 7732kb
input:
abcd abcde
output:
10
result:
ok 1 number(s): "10"
Test #4:
score: 0
Accepted
time: 0ms
memory: 7880kb
input:
aaba ba
output:
6
result:
ok 1 number(s): "6"
Test #5:
score: 0
Accepted
time: 0ms
memory: 13880kb
input:
babababaaabbaabababbbaabbbababbaaaaa aaaabbaababbab
output:
1161
result:
ok 1 number(s): "1161"
Test #6:
score: -100
Memory Limit Exceeded
input:
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa...