QOJ.ac
QOJ
ID | 题目 | 提交者 | 结果 | 用时 | 内存 | 语言 | 文件大小 | 提交时间 | 测评时间 |
---|---|---|---|---|---|---|---|---|---|
#403770 | #5312. Levenshtein Distance | qwqUwU_ | WA | 346ms | 12880kb | C++17 | 2.5kb | 2024-05-02 18:41:10 | 2024-05-02 18:41:11 |
Judging History
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'