QOJ.ac
QOJ
ID | 题目 | 提交者 | 结果 | 用时 | 内存 | 语言 | 文件大小 | 提交时间 | 测评时间 |
---|---|---|---|---|---|---|---|---|---|
#537805 | #7780. Dark LaTeX vs. Light LaTeX | HHAZ | TL | 27ms | 200568kb | C++20 | 4.7kb | 2024-08-30 18:35:37 | 2024-08-30 18:35:37 |
Judging History
answer
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
typedef long double ld;
typedef pair<int,int>pii;
typedef pair<ll,ll>pll;
typedef pair<ld,ld>pdd;
typedef pair<ll, pair<ll, ll> > plpair;
typedef vector<int> vi;
typedef vector<ll> vl;
#define endl '\n'
#define rep(i, a, b) for (int i = (a); i <= (b); ++i)
#define per(i, a, b) for(int i = (a); i >= (b); --i)
#define debug(x) cout<<#x<<": "<<x<<endl
#define lowbit(id) id & (-id)
#define fi first
#define sec second
#define lc id<<1
#define rc id<<1|1
#define sz(x) (int)(x).size()
#define all(t) (t).begin(), (t).end()
#define meh {cout<<"NO"<<endl;return;}
#define yay {cout<<"YES"<<endl;return;}
#define vin(v) for(auto&x:v)cin>>x;
#define print(v) for (auto x: v)cout<<x<<' ';cout<<endl;
#define sqrt(x) sqrtl(x)
mt19937_64 rnd(chrono::steady_clock::now().time_since_epoch().count());
const ll N = 1e4 + 10;
const int mod = 998244353;
//从i位置开始的后缀编号为i
//rk[i]:编号为i的后缀的排名 sa[i]:排名为i的后缀的编号 ht[i]:排名为i的后缀与排名为i-1的后缀的最长公共前缀
int siz,rk[2*N],oldrk[2*N],sa[2*N],id[N],cnt[N],ht[N];
int f[N][21];
ll ans = 0;
string s, t;
ll val[5005][5005];
void init_st()
{
memset(f, 0, sizeof(f));
for(int i=1;i<=siz;i++) f[i][0]=ht[i];
for(int k=1;k<21;k++)
{
for(int i=1;i+(1<<k)-1<=siz;i++)
{
f[i][k]=min(f[i][k-1],f[i+(1<<(k-1))][k-1]);
}
}
}
void init_sa(string s)
{
memset(rk, 0, sizeof(rk));
memset(oldrk, 0, sizeof(oldrk));
memset(sa, 0, sizeof(sa));
memset(id, 0, sizeof(id));
memset(cnt, 0, sizeof(cnt));
memset(ht, 0, sizeof(ht));
int n=siz=s.length();
s='|'+s;
int m=128,p=0;
for(int i=1;i<=n;i++) cnt[rk[i]=s[i]]++;
for(int i=1;i<=m;i++) cnt[i]+=cnt[i-1];
for(int i=n;i>=1;i--) sa[cnt[rk[i]]--]=i;
for (int w=1; ;w<<=1,m=p)
{
int cur=0;
for(int i=n-w+1;i<=n;i++) id[++cur]=i;
for(int i=1;i<=n;i++)
if(sa[i]>w) id[++cur]=sa[i]-w;
memset(cnt,0,sizeof(cnt));
for(int i=1;i<=n;i++) cnt[rk[i]]++;
for(int i=1;i<=m;i++) cnt[i]+=cnt[i-1];
for(int i=n;i>=1;i--) sa[cnt[rk[id[i]]]--]=id[i];
p=0;
memcpy(oldrk,rk,sizeof(oldrk));
for(int i=1;i<=n;i++)
{
if(oldrk[sa[i]]==oldrk[sa[i-1]]&&oldrk[sa[i]+w]==oldrk[sa[i-1]+w]) rk[sa[i]]=p;
else rk[sa[i]]=++p;
}
if(p==n) break;
}
for(int i=1,k=0;i<=n;i++)
{
if(rk[i]==0) continue;
if(k) k--;
while(s[i+k]==s[sa[rk[i]-1]+k]) k++;
ht[rk[i]]=k;
}
init_st();
}
int q_min(int l,int r)
{
int k=log2(r-l+1);
return min(f[l][k],f[r-(1<<k)+1][k]);
}
int lcp(int x,int y, int len)
{
int xx = x;
if(x==y) return len-x+1;
if(rk[x]>rk[y]) swap(x,y);
return min(len - xx + 1, q_min(rk[x]+1,rk[y]));
}
void cal(string a, string b) {
init_sa(a + b);
rep(i, 1, 5000) {
rep(j, 1, 5000) {
val[i][j] = 0;
}
}
rep(i, 1, (int)a.size()) {
rep(j, 1, (int)b.size()) {
if(lcp(i, a.size() + j, (int)a.size()) >= 1) {
val[i][i]++;
val[i][i + lcp(i, a.size() + j, (int)a.size())]--;
// if(i == 3) {
// debug(j);
// debug(lcp(i, a.size() + j, (int)a.size()));
// }
}
}
}
// debug(val[3][3]);
rep(i, 1, (int)a.size()) {
rep(j, 1, (int)a.size()) {
val[i][j] += val[i][j - 1];
}
}
ll s[5005];
rep(r, 1, (int)a.size()) {
rep(l, 1, r - 1) {
s[l] = val[l][r - 1];
}
s[0] = 0;
rep(l, 2, r - 1) {
s[l] += s[l - 1];
}
per(l, r - 2, 1) {
int len = min(r - 1, l + lcp(r, l, (int)a.size()));
ans += s[len] - s[l];
// if(l == 1 && r == 5) {
// debug(lcp(r, l, (int)a.size()));
// }
// if(s[len] - s[l]) {
// debug(r);
// debug(l);
// debug(len);
// debug(s[len] - s[l]);
// }
}
}
}
void solve() {
cin >> s >> t;
cal(s, t);
// debug(ans);
cal(t, s);
// debug(ans);
rep(i, 1, (int)t.size()) {
rep(j, 1, (int)s.size()) {
ans += lcp(i, j + t.size(), (int)t.size());
// if(lcp(i, j + t.size(), (int)t.size())) {
// debug(i);
// debug(j);
// debug(lcp(i, j + t.size(), (int)t.size()));
// }
}
}
cout << ans << endl;
}
signed main() {
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
int T = 1;
// cin >> T;
// cout.flush();
// ofstream outfile("C:\\Users\\86187\\OneDrive\\桌面\\1.txt");
// outfile << "a[1]=0;a[2]=1;";
// ll l = 1e7 + 1;
// rep(i, 3, 1e9) {
// printf("%lld\n", i);
// ll x = (i - 1) * ((a[i - 1] + a[i - 2]) % mod);
// x %= mod;
// if(i == l) {
// outfile << "a[" << i << "]=" << x << ";";
// }
// if(i == l + 1) {
// outfile << "a[" << i << "]=" << x << ";";
// l += 1e7;
// }
// }
while(T--) {
solve();
}
return 0;
}
详细
Test #1:
score: 100
Accepted
time: 20ms
memory: 200548kb
input:
abab ab
output:
8
result:
ok 1 number(s): "8"
Test #2:
score: 0
Accepted
time: 19ms
memory: 200520kb
input:
abab abaaab
output:
29
result:
ok 1 number(s): "29"
Test #3:
score: 0
Accepted
time: 21ms
memory: 200568kb
input:
abcd abcde
output:
10
result:
ok 1 number(s): "10"
Test #4:
score: 0
Accepted
time: 24ms
memory: 200392kb
input:
aaba ba
output:
6
result:
ok 1 number(s): "6"
Test #5:
score: 0
Accepted
time: 27ms
memory: 200480kb
input:
babababaaabbaabababbbaabbbababbaaaaa aaaabbaababbab
output:
1161
result:
ok 1 number(s): "1161"
Test #6:
score: -100
Time Limit Exceeded
input:
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa...