NOI Online 2021提高组第二题让我意识到了这件事的严重性!
#include <cstdio>
#include <cstring>
#include <algorithm>
#define mo1 10000003
#define mo2 10000007
#define ll long long
using namespace std;
int nxt[3005][27],pos[27];
int i,j,k,m,n,o,p,l,s,t;
char a[100005],b[100005];
ll hx1[10000004],hx2[10000008];
const ll mo3=1926081719491001;
const ll mo4=1949100119260817;
ll hash1(ll x)
{
ll pos=x%mo1;
while (hx1[pos]!=x&&hx1[pos]) pos=pos%mo1+1;
if (hx1[pos]==x) return 0;
hx1[pos]=x;return 1;
}
ll hash2(ll x)
{
ll pos=x%mo2;
while (hx2[pos]!=x&&hx2[pos]) pos=pos%mo2+1;
if (hx2[pos]==x) return 0;
hx2[pos]=x;return 1;
}
int main()
{
freopen("block.in","r",stdin);
freopen("block.out","w",stdout);
scanf("%d\n",&n);
scanf("%s\n",a+1);
scanf("%s\n",b+1);
for (i=0;i<=n;i++)
for (j=0;j<=27;j++) nxt[i][j]=1e9;
for (i=1;i<=n;i++)
{
int g=a[i]-'a'+1;
for (j=pos[g];j<=i-1;j++) nxt[j][g]=i;
pos[g]=i;
}
for (i=1;i<=n;i++)
{
t=0;
long long sum1=0,sum2=0;
for (j=i;j<=n;j++)
{
int g=b[j]-'a'+1;
if (nxt[t][g]==1e9) break;
else {
sum1=(sum1*28+g)%mo3,sum2=(sum2*27+g)%mo4;
if (hash1(sum1)&&hash2(sum2)) s++;
t=nxt[t][g];
}
}
}
printf("%d\n",s);
return 0;
}
这是一份比较正常的代码
之前我犯的沙雕错误包括
1.弄混
m
o
1
mo1
mo1与
m
o
3
mo3
mo3,
m
o
2
mo2
mo2与
m
o
4
mo4
mo4
2.我的惯用指数是
19260817
19260817
19260817,
19491001
19491001
19491001,双哈希两个
l
o
n
g
l
o
n
g
long long
longlong数组会炸空间!
(
256
M
B
)
(256MB)
(256MB)
3.
m
o
3
mo3
mo3和
m
o
4
mo4
mo4开的不够大