QOJ.ac

QOJ

IDProblemSubmitterResultTimeMemoryLanguageFile sizeSubmit timeJudge time
#403769#5312. Levenshtein DistanceqwqUwU_TL 0ms0kbC++172.5kb2024-05-02 18:40:062024-05-02 18:40:07

Judging History

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

  • [2024-05-02 18:40:07]
  • 评测
  • 测评结果:TL
  • 用时:0ms
  • 内存:0kb
  • [2024-05-02 18:40:06]
  • 提交

answer

// clang-format off
#include<bits/stdc++.h>
#define pb push_back
#define P make_pair
#define fi first
#define se second
#define rep(i,a,b) for(int i=(a);i<=(b);++i)
#define per(i,a,b) for(int i=(a);i>=(b);--i)
using namespace std;
typedef long long ll; 
typedef unsigned long long ull; 
typedef pair<int,int> pii; typedef pair<ll,int> pli; typedef pair<ll,ll> pll; typedef pair<int,ll> pil;
inline ll read(){
	ll x=0,f=1,c=getchar();
	while(c<'0'||c>'9')f=(c=='-'?-1:1),c=getchar();
	while(c>='0'&&c<='9')x=(x<<1)+(x<<3)+(c^48),c=getchar();
	return x*f;
}
const int N=1e5+3;
// clang-format on
int n,m,K;
char S[N],T[N];
int A[N<<1];
int sa[N<<1],rk[N<<1],st[18][N<<1];
inline int lcp(int i,int j){
	if(i>n||j>m)return 0;
	i=rk[i],j=rk[j+n+1];
	if(i>j)swap(i,j);
	int k=__lg(j-i++);
	return min(st[k][i],st[k][j-(1<<k)+1]);
}
int f[33][63];
inline void ckmax(int &x,int y){x=max(x,y);}
inline int& F(int i,int j){return f[i][j+K];}
int main() {
    freopen("data.in", "r", stdin);
    // freopen(".in","r",stdin);
     //freopen("myans.out","w",stdout);
	K=read();scanf("%s",S+1),n=strlen(S+1);
	scanf("%s",T+1);m=strlen(T+1);
	rep(i,1,n)A[i]=S[i];A[n+1]=32;
	rep(i,1,m)A[n+1+i]=T[i];
	static int cnt[N<<1];int len=n+m+1,lim=127;
	rep(i,1,len)++cnt[rk[i]=A[i]];
	rep(i,1,lim)cnt[i] += cnt[i-1];
	per(i,len,1)sa[cnt[rk[i]]--]=i;
	for(int w=1,p=0;w<=len;w<<=1,lim=p,p=0){
		static int id[N<<1];
		per(i,len,len-w+1)id[++p]=i;
		rep(i,1,len)if(sa[i]>w)id[++p]=sa[i]-w;
		memset(cnt,0,sizeof cnt);
		rep(i,1,len)++cnt[rk[id[i]]];
		rep(i,1,lim)cnt[i] += cnt[i-1];
		per(i,len,1)sa[cnt[rk[id[i]]]--]=id[i],id[i]=0;
		static int tmp[N<<1];swap(tmp,rk);
		p=0;rep(i,1,len)rk[sa[i]]=(tmp[sa[i]]==tmp[sa[i-1]]&&tmp[sa[i]+w]==tmp[sa[i-1]+w]?p:++p);
		if(p==n)break;
	}
	rep(i,1,len){
		if(rk[i]==1)continue;
		int &k=st[0][rk[i]]=max(0,st[0][rk[i-1]]-1);
		while(A[i+k]==A[sa[rk[i]-1]+k])++k;
	}
	rep(j,1,17)rep(i,1,len-(1<<j)+1)st[j][i]=min(st[j-1][i],st[j-1][i+(1<<(j-1))]);
	static int ans[31];
	rep(ST,0,m-1){
		memset(f,-1,sizeof f);F(0,0)=0;
		rep(i,0,K)rep(j,-i,i)if(~F(i,j)){
			F(i,j) += lcp(F(i,j)+1,F(i,j)+ST+j+1);
			if(i==K)break;
			ckmax(F(i+1,j+1),F(i,j));
			ckmax(F(i+1,j),F(i,j)+1);
			ckmax(F(i+1,j-1),F(i,j)+1);
		}
		//rep(i,0,K)rep(j,-i,i)printf("F(%d,%d)=%d\n",i,j,F(i,j));

		//puts("");
		rep(j,-min(K,n-1),min(K,m-n-ST))rep(i,abs(j),K)if(F(i,j)>=n){
			++ans[i];break;}
	}
	rep(i,0,K)printf("%d\n",ans[i]);
    return 0;
}

Details

Tip: Click on the bar to expand more detailed information

Test #1:

score: 0
Time Limit Exceeded

input:

4
aaa
aabbaab

output:


result: