QOJ.ac

QOJ

IDProblemSubmitterResultTimeMemoryLanguageFile sizeSubmit timeJudge time
#735280#5312. Levenshtein DistanceOthersWA 779ms40812kbC++143.8kb2024-11-11 18:55:272024-11-11 18:55:28

Judging History

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

  • [2024-11-11 18:55:28]
  • 评测
  • 测评结果:WA
  • 用时:779ms
  • 内存:40812kb
  • [2024-11-11 18:55:27]
  • 提交

answer

#include <bits/stdc++.h>
#define ll long long
#define int long long
#define ull unsigned ll
#define eps 1e-12
#define db long double
#define ull unsigned long long
#define wr(x,ch) write(x),putchar(ch)
#define lb(x) ((x)&-(x))
#define inf (0x3f3f3f3f)
#define il inline
using namespace std;
typedef pair<ll,ll> pai;
#define x first
#define y second
ll read() {
	ll x=0;
	bool f=0;char c=getchar();
	while(!isdigit(c)) f|=c=='-',c=getchar();
	while(isdigit(c)) x=(x<<3)+(x<<1)+(c^48),c=getchar();
	return f?-x:x;
}
void write(ll x) {
	if(x<0) putchar('-'),x=-x;
	if(x>=10) write(x/10);
	putchar(x%10^48);
	return ;
}
const int N=1e5+5,K=65,ba=10086001,mod=1e9+9;
int f[K][K],k,n,m,vis[K],ans[K];
char a[N],b[N];
int base[N*2],has[N*2];
int lg[N*2],sa[N*2],rk[N*2],nrk[N*2],st[20][N*2],id[N*2],l;
char c[N*2];
pai pos[N*2];
bool cmp(int x,int y) {
	return c[x]<c[y];
}
bool cmp2(int x,int y) {
	return pos[x]<pos[y];
}
struct Yanami {
	il void init() {
		l=0;
		for(int i=1;i<=n;i++) c[++l]=a[i];
		c[++l]='#';
		for(int i=1;i<=m;i++) c[++l]=b[i];
		base[0]=1;
		for(int i=1;i<=l;i++) base[i]=base[i-1]*ba%mod;
		for(int i=1;i<=l;i++) has[i]=(has[i-1]*ba+c[i])%mod;
		for(int i=2;i<=l;i++) lg[i]=lg[i>>1]+1;
		for(int i=1;i<=l;i++) id[i]=i;
		sort(id+1,id+l+1,cmp);
		int cnt=0;
		for(int i=1;i<=l;i++) rk[id[i]]=(cnt+=(c[id[i]]!=c[id[i-1]]));
		// printf("init : ");for(int j=1;j<=l;j++) printf("%d ",rk[j]);puts("");
		for(int i=0;i<=lg[l];i++) {
			for(int j=1;j<=l;j++) pos[j]=pai(rk[j],rk[j+(1<<i)]),id[j]=j;
			sort(id+1,id+l+1,cmp2);
			cnt=0;
			for(int j=1;j<=l;j++) rk[id[j]]=(cnt+=(pos[id[j]]!=pos[id[j-1]]));
			// printf("%d : ",i);for(int j=1;j<=l;j++) printf("%d ",rk[j]);puts("");
		}
		// printf("%s",c+1);puts("");
		for(int i=1;i<=l;i++) sa[rk[i]]=i;
		// for(int i=1;i<=l;i++) printf("%d ",sa[i]);puts("");
		for(int i=1;i<l;i++) st[0][i]=getlen(sa[i],sa[i+1]);//,printf("%d ",st[0][i]);puts("");
		for(int i=1;i<=lg[l];i++) 
			for(int j=1;j+(1<<i)-1<=l;j++) 
				st[i][j]=min(st[i-1][j],st[i-1][j+(1<<i-1)]);
		return ;
	}
	il int ask(int l,int r,int *has) {
		return (has[r]-has[l-1]*base[r-l+1]%mod+mod)%mod;
	}
	il int getlen(int x,int y) {
		int l=0,r=min(::l-x+1,::l-y+1),mid;
		while(l<r) {
			mid=l+r+1>>1;
			if(ask(x,x+mid-1,has)==ask(y,y+mid-1,has)) l=mid;
			else r=mid-1;
		}
		return l;
	}
	il int getmin(int l,int r) {
		int Lg=lg[r-l+1];
		return min(st[Lg][l],st[Lg][r-(1<<Lg)+1]);
	}
	il int ask(int x,int y) {
		return getmin(rk[x],rk[y+n+1]-1);
	}
}LCP;
il void chkmax(int &x,int y) {
	if(y>x) x=y;
	return ;
}
signed main() {
	k=read();
	scanf("%s%s",a+1,b+1);
	n=strlen(a+1),m=strlen(b+1);
	LCP.init();
	for(int l=1;l<=m;l++) {
		for(int i=0;i<=k;i++) {
			for(int j=0;j<=2*k;j++) 
				f[i][j]=-inf,vis[j]=0;
		}
		f[0][k]=LCP.ask(1,l);
		// printf("%d::\n",l);
		for(int i=0;i<=k;i++) {
			for(int j=1;j<=2*k-1;j++) {
				if(f[i][j]<0) continue;
				int x=f[i][j],y=l+f[i][j]+(j-k)-1;
				if(x<n&&y<m) chkmax(f[i+1][j],f[i][j]+LCP.ask(x+2,y+2)+1);
				if(x<n&&y<m-1&&LCP.ask(x+1,y+2)) chkmax(f[i+1][j+1],f[i][j]+LCP.ask(x+1,y+2));
				if(x<n) chkmax(f[i+1][j-1],f[i][j]+LCP.ask(x+2,y+1)+1);
				// if(x==n&&y<m) chkmax(f[i+1][j+1],f[i][j]);
			}
			for(int j=0;j<2*k;j++) {
				if(l+f[i][j]+(j-k)-1<m) 
					chkmax(f[i+1][j+1],f[i][j]);
				chkmax(f[i+1][j-1],f[i][j]);
			}
			for(int j=0;j<=2*k;j++) 
				if(vis[j]) f[i][j]=-inf;
				else if(f[i][j]==n) vis[j]=1;
			// printf("%d : ",i);
			// for(int j=0;j<=2*k;j++) printf("%4d ",f[i][j]==-inf?-1:f[i][j]);puts("");
			for(int j=0;j<=2*k;j++) 
				if(f[i][j]==n&&k-j<n) 
					ans[i]++;
		}
	}
	// wr(ans[k],'\n');
	// puts("----------");
	for(int i=0;i<=k;i++) wr(ans[i],'\n');
	return 0;
}
/*
g++ 1.cpp -o 1.exe -std=c++14 -O2;./1.exe

*/

Details

Tip: Click on the bar to expand more detailed information

Test #1:

score: 100
Accepted
time: 0ms
memory: 18112kb

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: 779ms
memory: 40812kb

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: 723ms
memory: 39560kb

input:

30
BBAAABAABBBA
ABBABBBBAABAAAABABBBAABAABBAABAAAAAABAABABBAAAABAAAAABABAABAABBABBAAAABBBBAABBABAAABAABAABBBBBABBABABBBBABBBBAAABBABABBBBAAABBBBAAAABABABABABABABAAABBBBBAABAABAABBAABBBAABBBBBBBABAABAABAABABAABAAABAABBBAABABBABBAAABAAAABABABBABBBAAABBBAAAABBBBABABABAABAABBBBBBBBBAABBBABABBBABAABBABBA...

output:

66081
150458
173525
193839
197134
196197
185440
182545
181663
181048
180652
180407
90278
90171
90097
90046
90012
89988
89977
89974
89971
89969
89967
89966
89965
89964
89963
89962
89961
89960
89959

result:

wrong answer 1st numbers differ - expected: '17', found: '66081'