QOJ.ac

QOJ

IDProblemSubmitterResultTimeMemoryLanguageFile sizeSubmit timeJudge time
#399124#5312. Levenshtein Distancedongyc666RE 387ms31164kbC++172.9kb2024-04-25 22:21:432024-04-25 22:21:51

Judging History

This is the latest submission verdict.

  • [2024-04-25 22:21:51]
  • Judged
  • Verdict: RE
  • Time: 387ms
  • Memory: 31164kb
  • [2024-04-25 22:21:43]
  • Submitted

answer

#include<bits/stdc++.h>
using namespace std;
const int NR=4e5+10;
int n,m,k,len,a[NR],f[40][70],ans[60];
char s[NR],t[NR];
void chkmax(int &x,int y){x=(x>y)?x:y;}

int maxV,cnt[NR],sum[NR];
int sa[NR],rnk[NR<<1],h[NR],height[NR];
struct task{
	int x,y,id;
}t1[NR],t2[NR];
void clear(){
	memset(cnt,0,sizeof(cnt));
	memset(sum,0,sizeof(sum));
}
void SA(){
	for(int i=1;i<=len;i++)rnk[i]=a[i];
//	for(int i=1;i<=len;i++)cout<<rnk[i]<<' ';puts("");
	for(int k=1;k<=len;k<<=1){
		clear();
		for(int i=1;i<=len;i++)t1[i]=task{rnk[i],rnk[i+k],i};
		for(int i=1;i<=len;i++)cnt[t1[i].y]++;
		for(int i=0;i<=maxV;i++)sum[i+1]=sum[i]+cnt[i];
		memset(cnt,0,sizeof(cnt));
		for(int i=1;i<=len;i++)t2[sum[t1[i].y]+(++cnt[t1[i].y])]=t1[i];
//		for(int i=1;i<=len;i++)printf("%d %d %d\n",t2[i].x,t2[i].y,t2[i].id);
		clear();
		for(int i=1;i<=len;i++)cnt[t2[i].x]++;
		for(int i=0;i<=maxV;i++)sum[i+1]=sum[i]+cnt[i];
		memset(cnt,0,sizeof(cnt));
		for(int i=1;i<=len;i++)t1[sum[t2[i].x]+(++cnt[t2[i].x])]=t2[i];
		int now=0;
		for(int i=1;i<=len;i++){
			if(t1[i].x!=t1[i-1].x||t1[i].y!=t1[i-1].y)now++;
			rnk[t1[i].id]=now;
		}
		maxV=now;
//	for(int i=1;i<=len;i++)cout<<rnk[i]<<' ';puts("");
	}
	for(int i=1;i<=len;i++)sa[rnk[i]]=i;
	for(int i=1;i<=len;i++){
		int x=i,y=sa[rnk[i]-1];
		int now=max(0,h[i-1]-1);
		while(now+max(x,y)<=len&&a[x+now]==a[y+now])now++;
		h[i]=now;
	}
	for(int i=1;i<=len;i++)height[rnk[i]]=h[i];
//	for(int i=1;i<=len;i++)cout<<sa[i]<<' ';puts("");
//	for(int i=1;i<=len;i++)cout<<height[i]<<' ';puts("");
}
int minv[NR][20],lg[NR];
void init(){
	for(int i=1;i<=len;i++)
		minv[i][0]=height[i],lg[i]=lg[i>>1]+1;
	for(int i=1;i<=18;i++)
		for(int j=1;j+(1<<i)<=len+1;j++)
			minv[j][i]=min(minv[j][i-1],minv[j+(1<<(i-1))][i-1]);
}
int query(int l,int r){
	int k=lg[r-l+1]-1;
	return min(minv[l][k],minv[r-(1<<k)+1][k]);
}
int calc(int x,int y){
	x=rnk[x];y=rnk[y];
	if(x>y)swap(x,y);
	return query(x+1,y);
}

signed main(){
	cin>>k;
	scanf("%s%s",s+1,t+1);
	n=strlen(s+1);m=strlen(t+1);
	for(int i=1;i<=n;i++)a[++len]=s[i]-'a'+1;
	a[++len]=maxV=27;
	for(int i=1;i<=m;i++)a[++len]=t[i]-'a'+1;
	SA();init();
//	cout<<query(2,3)<<endl;
	for(int i=1;i<=m;i++){
		memset(f,0,sizeof(f));
		for(int j=0;j<=k;j++)
			for(int x=k-j;x<=k+j;x++){
				if(f[j][x]<n){
					f[j][x]+=calc(f[j][x]+1,n+1+i+(x-k)+f[j][x]);
				}
//				if(f[j][x]==n)printf("i:%d j:%d x:%d %d\n",i,j,x,f[j][x]);
//				if(f[j][x]==n)ans[j]++;
				if(j<k){
					chkmax(f[j+1][x-1],min(f[j][x]+1,n));//加一个
					if(i+f[j][x]-1+(x-k)<m)chkmax(f[j+1][x],min(n,f[j][x]+1));//换一个
					if(i+f[j][x]-1+(x-k)<m)chkmax(f[j+1][x+1],f[j][x]);//删一个 
				}
			}
		for(int x=0;x<=2*k;x++)if(n+x-k>0)
			for(int j=0;j<=k;j++)
				if(f[j][x]==n){
					ans[j]++;//printf("i:%d j:%d x:%d\n",i,j,x-k);
					break;
				}
	}
	for(int i=0;i<=k;i++)cout<<ans[i]<<'\n';
	return 0;
}

Details

Tip: Click on the bar to expand more detailed information

Test #1:

score: 100
Accepted
time: 5ms
memory: 20120kb

input:

4
aaa
aabbaab

output:

0
5
15
7
1

result:

ok 5 number(s): "0 5 15 7 1"

Test #2:

score: 0
Accepted
time: 387ms
memory: 31164kb

input:

30
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA...

output:

0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0

result:

ok 31 numbers

Test #3:

score: -100
Runtime Error

input:

30
BBAAABAABBBA
ABBABBBBAABAAAABABBBAABAABBAABAAAAAABAABABBAAAABAAAAABABAABAABBABBAAAABBBBAABBABAAABAABAABBBBBABBABABBBBABBBBAAABBABABBBBAAABBBBAAAABABABABABABABAAABBBBBAABAABAABBAABBBAABBBBBBBABAABAABAABABAABAAABAABBBAABABBABBAAABAAAABABABBABBBAAABBBAAAABBBBABABABAABAABBBBBBBBBAABBBABABBBABAABBABBA...

output:


result: