QOJ.ac

QOJ

ID题目提交者结果用时内存语言文件大小提交时间测评时间
#762885#5312. Levenshtein DistancehighkjTL 0ms3776kbC++112.1kb2024-11-19 17:07:262024-11-19 17:07:26

Judging History

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

  • [2024-11-19 17:07:26]
  • 评测
  • 测评结果:TL
  • 用时:0ms
  • 内存:3776kb
  • [2024-11-19 17:07:26]
  • 提交

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...

output:


result: