关于这题时间复杂度
查看原帖
关于这题时间复杂度
221729
qsceszthn楼主2021/3/31 12:56

n^2logn过不去么?还是我算错时间复杂度了

//#pragma GCC optimize ("O2")
#include<bits/stdc++.h>
#define ull unsigned long long
#define rep(i,a,b) for(register int i=(a);i<=(b);++i)
#define per(i,a,b) for(register int i=(a);i>=(b);--i)
using namespace std;
const int N=3005,base=13331;
int n,ans,suf[N][30];
ull ha[N][N];
map<ull,int> vis;
char a[N],b[N];
bool chk(int l,int r){
	register int v1=vis[ha[l][r]],v2=vis[ha[l][r-1]];
	if(!v1 && suf[v2+1][b[r]-'a'+1]!=1061109567 && r-l+1==1){
		vis[ha[l][r]]=suf[1][b[r]-'a'+1];
		return 1;
	}
	if(!v2 || v1)return 0;
	if(suf[v2+1][b[r]-'a'+1]!=1061109567){
		vis[ha[l][r]]=suf[v2+1][b[r]-'a'+1];
		return 1;
	}
	return 0;
}
signed main(){
//	freopen("1.in","r",stdin);
	scanf("%d%s%s",&n,a+1,b+1);
	memset(suf,0x3f,sizeof(suf));
	per(i,n,1){
		suf[i][a[i]-'a'+1]=min(suf[i][a[i]-'a'+1],i);
		rep(j,1,26)suf[i][j]=min(suf[i+1][j],suf[i][j]);
	}
	rep(i,1,n)rep(j,i,n)ha[i][j]=ha[i][j-1]*base+b[j];
	rep(i,1,n){
		rep(j,1,n){
			if(j+i-1<=n && chk(j,j+i-1))++ans;
		}
	}
	printf("%d\n",ans);
	return 0;
}
2021/3/31 12:56
加载中...