QOJ.ac

QOJ

IDProblemSubmitterResultTimeMemoryLanguageFile sizeSubmit timeJudge time
#312654#7780. Dark LaTeX vs. Light LaTeXconfesserWA 803ms397364kbC++172.1kb2024-01-24 09:44:512024-01-24 09:44:51

Judging History

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

  • [2024-11-25 20:53:52]
  • hack成功,自动添加数据
  • (/hack/1258)
  • [2024-01-24 09:44:51]
  • 评测
  • 测评结果:WA
  • 用时:803ms
  • 内存:397364kb
  • [2024-01-24 09:44:51]
  • 提交

answer

#include <bits/stdc++.h>
using namespace std;
using ll=long long;
using vi=vector<int>;
using pi=pair<int,int>;
#define F(i,a,b) for(int i=(a);i<=(b);i++)
#define G(i,a,b) for(int i=(a);i>=(b);i--)
#define ms(a,b) memset(a,b,sizeof(a))
#define si(a) ((int)(a).size())
#define all(a) (a).begin(),(a).end()
#define fi first
#define se second
#define pb push_back

const int N=1e4+3;
char a[N],b[N],c[N];
int cnt[N][N];

struct SA{
	char s[N];
	int n,sa[N],rk[N],ht[N],mn[N][22];
	void init(char *s,int nn){
		n=nn;
		static int cnt[N],sa0[N],rk0[N],h[N];
		ms(cnt,0),ms(sa,0),ms(rk,0);
		F(i,1,n) sa[i]=i;
		sort(sa+1,sa+n+1,[&](int x,int y){return s[x]<s[y];});
		F(i,1,n) rk[sa[i]]=rk[sa[i-1]]+(s[sa[i-1]]!=s[sa[i]]);
		for(int p=1;p<n;p*=2){
			F(i,1,n) cnt[rk[sa[i]]]=i;
			G(i,n,1) if(sa[i]>p) sa0[cnt[rk[sa[i]-p]]--]=sa[i]-p;
			G(i,n,n-p+1) sa0[cnt[rk[i]]--]=i;
			F(i,1,n) sa[i]=sa0[i];
			F(i,1,n) rk0[sa[i]]=rk0[sa[i-1]]+(rk[sa[i-1]]!=rk[sa[i]]||rk[sa[i-1]+p]!=rk[sa[i]+p]);
			F(i,1,n) rk[i]=rk0[i];
		}
		F(i,1,n){
			int j=sa[rk[i]-1],k=max(0,h[i-1]-1);
			while(i+k<=n&&j+k<=n&&s[i+k]==s[j+k]) k++;
			h[i]=ht[rk[i]]=k; 
		}
		F(i,1,n) mn[i][0]=ht[i];
		F(j,1,20) F(i,1,n-(1<<j)+1) mn[i][j]=min(mn[i][j-1],mn[i+(1<<(j-1))][j-1]);
	}
	int qry(int l,int r){
		int k=__lg(r-l+1);
		return min(mn[l][k],mn[r-(1<<k)+1][k]);
	}
	int lcp(int x,int y){
		if(x==y)return n-x+1;
		if(rk[x]>rk[y])swap(x,y);
		return qry(rk[x]+1,rk[y]);
	}
}A,B,C;

int main(){
	cin.tie(0)->ios::sync_with_stdio(0);
	cin>>(a+1)>>(b+1);
	int ans=0;
	auto slv=[&](int flg){
		int n=strlen(a+1),m=strlen(b+1);
		A.init(a,n);
		B.init(b,m);
		F(i,1,n) c[i]=a[i];
		c[n+1]='#';
		F(i,1,m) c[n+1+i]=b[i];
		C.init(c,n+m+1);
		ms(cnt,0);
		F(i,1,m) F(j,1,m){
			int k=B.lcp(i,j);
			cnt[i][j]++;
			cnt[i+k][j]--;
		}
		F(i,1,m) F(j,1,m) cnt[i][j]+=cnt[i-1][j];
//		F(i,1,m) F(j,1,m) cout<<cnt[i][j]<<" \n"[j==m];
		F(i,1,m) F(j,1,m) cnt[i][j]+=cnt[i][j-1];
		F(i,1,n) F(j,1,m){
			int k=C.lcp(i,n+1+j);
			if(j-1<=min(j+k,m)){
				ans+=cnt[j-1][min(j+k,m)]-cnt[j-1][j]+k*flg;
			}
		}
	};
	slv(0);
	swap(a,b);
	slv(1);
	cout<<ans;
}

Details

Tip: Click on the bar to expand more detailed information

Test #1:

score: 100
Accepted
time: 44ms
memory: 396388kb

input:

abab
ab

output:

8

result:

ok 1 number(s): "8"

Test #2:

score: 0
Accepted
time: 44ms
memory: 395860kb

input:

abab
abaaab

output:

29

result:

ok 1 number(s): "29"

Test #3:

score: 0
Accepted
time: 46ms
memory: 397216kb

input:

abcd
abcde

output:

10

result:

ok 1 number(s): "10"

Test #4:

score: 0
Accepted
time: 48ms
memory: 396148kb

input:

aaba
ba

output:

6

result:

ok 1 number(s): "6"

Test #5:

score: 0
Accepted
time: 43ms
memory: 397004kb

input:

babababaaabbaabababbbaabbbababbaaaaa
aaaabbaababbab

output:

1161

result:

ok 1 number(s): "1161"

Test #6:

score: -100
Wrong Answer
time: 803ms
memory: 397364kb

input:

aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa...

output:

736364688

result:

wrong answer 1st numbers differ - expected: '78156256250000', found: '736364688'