QOJ.ac
QOJ
The 2nd Universal Cup Finals is coming! Check out our event page, schedule, and competition rules!
ID | 题目 | 提交者 | 结果 | 用时 | 内存 | 语言 | 文件大小 | 提交时间 | 测评时间 |
---|---|---|---|---|---|---|---|---|---|
#399131 | #5312. Levenshtein Distance | dongyc666 | WA | 349ms | 31044kb | C++17 | 2.9kb | 2024-04-25 22:43:22 | 2024-04-25 22:43:22 |
Judging History
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)exit(0);
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&&i-1+f[j][x]+(x-k)<m){
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;
}
詳細信息
Test #1:
score: 100
Accepted
time: 5ms
memory: 22068kb
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: 349ms
memory: 31044kb
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: 28ms
memory: 27260kb
input:
30 BBAAABAABBBA ABBABBBBAABAAAABABBBAABAABBAABAAAAAABAABABBAAAABAAAAABABAABAABBABBAAAABBBBAABBABAAABAABAABBBBBABBABABBBBABBBBAAABBABABBBBAAABBBBAAAABABABABABABABAAABBBBBAABAABAABBAABBBAABBBBBBBABAABAABAABABAABAAABAABBBAABABBABBAAABAAAABABABBABBBAAABBBAAAABBBBABABABAABAABBBBBBBBBAABBBABABBBABAABBABBA...
output:
result:
wrong answer Answer contains longer sequence [length = 31], but output contains 0 elements