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;
}