QOJ.ac
QOJ
ID | 题目 | 提交者 | 结果 | 用时 | 内存 | 语言 | 文件大小 | 提交时间 | 测评时间 |
---|---|---|---|---|---|---|---|---|---|
#762885 | #5312. Levenshtein Distance | highkj | TL | 0ms | 3776kb | C++11 | 2.1kb | 2024-11-19 17:07:26 | 2024-11-19 17:07:26 |
Judging History
answer
#include <bits/stdc++.h>
#include<ext/pb_ds/assoc_container.hpp>
#include<ext/pb_ds/tree_policy.hpp>
#include <ext/rope>
using namespace __gnu_pbds;
using namespace std;
#define pb push_back
#define rep(i,x,y) for(register int i=x;i<=y;i++)
#define rep1(i,x,y) for(register int i=x;i>=y;--i)
#define fire signed
#define il inline
template<class T> il void print(T x) {
if(x<0) printf("-"),x=-x;
if (x > 9) print(x / 10);
putchar(x % 10 + '0');
}
template<class T> il void in(T &x) {
x = 0; char ch = getchar();
int f = 1;
while (ch < '0' || ch > '9') {if(ch=='-') f = -1; ch = getchar(); }
while (ch >= '0' && ch <= '9') { x = (x << 3) + (x << 1) + (ch ^ 48); ch = getchar(); }
x *= f;
}
#define ull unsigned long long
int T=1;
const int N=1e5+10;
const int M=32;
long long f[M][M+M];
int k;
string s,t;
const int ba=131;
ull ha[N],ha1[N],jc[N];
int n,m;
ull has(int l,int r) {
return ha[r]-ha[l-1]*jc[r-l+1];
}
ull has1(int l,int r) {
return ha1[r]-ha1[l-1]*jc[r-l+1];
}
int lcp(int x,int y) {
int l=0,r=min(n-x+1,m-y+1),res=0;
while(l<=r) {
int mid=l+r>>1;
if(has(x,x+mid-1)==has1(y,y+mid-1)) l=mid+1,res=mid;
else r=mid-1;
}
return res;
}
long long ans[N];
void solve() {
jc[0]=1;
in(k);
cin>>s;
cin>>t;
s=" "+s;
t=" "+t;
n=s.size()-1;
m=t.size()-1;
rep(i,1,max(n,m)) jc[i]=jc[i-1]*ba;
rep(i,1,n) ha[i]=ha[i-1]*ba+s[i]-'a'+1;
rep(i,1,m) ha1[i]=ha1[i-1]*ba+t[i]-'a'+1;
rep(le,1,m) {
memset(f,0,sizeof f);
f[0][M]=lcp(1,le);
rep(nowk,0,k) {
rep(l,-nowk,nowk) {
int len1=f[nowk][l+M],len2=len1+l+le-1;
f[nowk+1][l+M]=max(f[nowk+1][l+M],f[nowk][l+M]+lcp(len1+2,len2+2)+1);
f[nowk+1][l+M-1]=max(f[nowk+1][l+M-1],f[nowk][l+M]+lcp(len1+2,len2+1)+1);
f[nowk+1][l+M+1]=max(f[nowk+1][l+M+1],f[nowk][l+M]+lcp(len1+1,len2+2));
}
}
rep(l,-k,k) {
if(l+n<=0||l+n>m-le+1) continue;
rep(nowk,0,k) {
if(f[nowk][l+M]>=n) {
ans[nowk]++;
break;
}
}
}
}
rep(i,0,k) {
// ans[i]+=ans[i-1];
printf("%lld\n",ans[i]);
}
}
fire main() {
while(T--) {
solve();
}
return false;
}
詳細信息
Test #1:
score: 100
Accepted
time: 0ms
memory: 3776kb
input:
4 aaa aabbaab
output:
0 5 15 7 1
result:
ok 5 number(s): "0 5 15 7 1"
Test #2:
score: -100
Time Limit Exceeded
input:
30 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA...