QOJ.ac

QOJ

ID题目提交者结果用时内存语言文件大小提交时间测评时间
#403770#5312. Levenshtein DistanceqwqUwU_WA 346ms12880kbC++172.5kb2024-05-02 18:41:102024-05-02 18:41:11

Judging History

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

  • [2024-05-02 18:41:11]
  • 评测
  • 测评结果:WA
  • 用时:346ms
  • 内存:12880kb
  • [2024-05-02 18:41:10]
  • 提交

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;
}

详细

Test #1:

score: 100
Accepted
time: 2ms
memory: 6216kb

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: 346ms
memory: 12856kb

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
Wrong Answer
time: 324ms
memory: 12880kb

input:

30
BBAAABAABBBA
ABBABBBBAABAAAABABBBAABAABBAABAAAAAABAABABBAAAABAAAAABABAABAABBABBAAAABBBBAABBABAAABAABAABBBBBABBABABBBBABBBBAAABBABABBBBAAABBBBAAAABABABABABABABAAABBBBBAABAABAABBAABBBAABBBBBBBABAABAABAABABAABAAABAABBBAABABBABBAAABAAAABABABBABBBAAABBBAAAABBBBABABABAABAABBBBBBBBBAABBBABABBBABAABBABBA...

output:

17
662
8230
50302
166666
310121
345469
280387
227200
209178
203013
198561
105117
102147
99771
97730
96058
94730
93633
92720
92060
91525
91143
90831
90585
90419
90288
90200
90120
90068
89960

result:

wrong answer 31st numbers differ - expected: '90035', found: '89960'