Hash初入门
大概就是正序建立一个hash值,逆序建立一个hash值,然后尝试删去每一位,计算所有去掉这一位的串的hash值,相等即为整串只相差这一位。
#include<iostream>
#include<cstdlib>
#include<cstring>
#include<algorithm>
#include<cstdio>
using namespace std;
const int maxn=30005;
const int maxm=205;
int n,len;
long long h1[maxn][maxm],h2[maxn][maxm],hash[maxn*maxm];
char s[maxm];
void gethash(int i)
{
for(int j=1;j<=len;j++)
h1[i][j]=h1[i][j-1]*149+s[j];
for(int j=len;j>=1;j--)
h2[i][j]=h2[i][j+1]*137+s[j];
}
int main()
{
scanf("%d%d%*d\n",&n,&len);
for(int i=1;i<=n;i++)
{
scanf("%s",s+1);
gethash(i);
}
int ans=0;
for(int i=1;i<=len;i++)
{
for(int j=1;j<=n;j++)
hash[j]=h1[j][i-1]*233+h2[j][i+1]*213;
sort(hash+1,hash+n+1);
int now=1;
for(int j=2;j<=n;j++)
{
if(hash[j]!=hash[j-1])now=0;
else now++,ans+=now;
}
}
printf("%d",ans);
return 0;
}
#include<iostream>
#include<cstdlib>
#include<cstring>
#include<algorithm>
#include<cstdio>
using namespace std;
const int maxn=30005;
const int maxm=205;
int n,len;
long long h1[maxn][maxm],h2[maxn][maxm],hash[maxn*maxm];
char s[maxm];
void gethash(int i)
{
if(i==4)
{
i++;
i--;
}
for(int j=1;j<=len;j++)
h1[i][j]=h1[i][j-1]*149+s[j];
for(int j=len;j>=1;j--)
h2[i][j]=h2[i][j+1]*137+s[j];
}
int main()
{
scanf("%d%d%*d\n",&n,&len);
for(int i=1;i<=n;i++)
{
scanf("%s",s+1);
gethash(i);
}
for(int i=1;i<=n;i++)
for(int j=1;j<=len;j++)
hash[(i-1)*len+j]=(h1[i][j-1]*233+h2[i][j+1]*213);
sort(hash+1,hash+n*len+1);
long long now,ans=0,last=-1;
for(int i=1;i<=n*len;i++)
{
if(last!=hash[i])last=hash[i],now=0;
else if(last==hash[i])now++,ans+=now;
}
printf("%lld",ans);
return 0;
}