QOJ.ac

QOJ

IDProblemSubmitterResultTimeMemoryLanguageFile sizeSubmit timeJudge time
#735264#5312. Levenshtein DistanceOthersWA 826ms39836kbC++143.8kb2024-11-11 18:49:012024-11-11 18:49:02

Judging History

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

  • [2024-11-11 18:49:02]
  • 评测
  • 测评结果:WA
  • 用时:826ms
  • 内存:39836kb
  • [2024-11-11 18:49:01]
  • 提交

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]-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: 3ms
memory: 18124kb

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: 814ms
memory: 39580kb

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: 826ms
memory: 39836kb

input:

30
BBAAABAABBBA
ABBABBBBAABAAAABABBBAABAABBAABAAAAAABAABABBAAAABAAAAABABAABAABBABBAAAABBBBAABBABAAABAABAABBBBBABBABABBBBABBBBAAABBABABBBBAAABBBBAAAABABABABABABABAAABBBBBAABAABAABBAABBBAABBBBBBBABAABAABAABABAABAAABAABBBAABABBABBAAABAAAABABABBABBBAAABBBAAAABBBBABABABAABAABBBBBBBBBAABBBABABBBABAABBABBA...

output:

66080
150445
173518
193860
197151
196211
185448
182552
181672
181053
180655
180409
90280
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: '66080'