字符串哈希学习笔记

前置资料

洛谷日报
字符串hash模板

Code

单哈希AC代码

#include<bits/stdc++.h>
using namespace std;
long long base=50513,mod=212370440130137957,prime=76543;
long long n,a[10010],ans;
char s[10010];
int hash()
{
	long long res=0,len=strlen(s);
	for(int i=0;i<len;i++)
	{
		res=res*base+s[i]+prime;
		res%=mod;
	}
	return res;
}
int main()
{
	scanf("%lld",&n);
	for(int i=1;i<=n;i++)
	{
		cin>>s;
		a[i]=hash();
	}
	sort(a+1,a+n+1);
	for(int i=1;i<=n;i++)
	{
		if(a[i]!=a[i-1])
		{
			ans++;
		}
	}
	cout<<ans;
} 

Code

双哈希AC代码

#include<bits/stdc++.h>
using namespace std;
long long base=50513,mod=212370440130137957,prime=76543;
long long base2=23333,mod2=19260817,prime2=76543; 
long long n,ans;
char s[10010];
struct node
{
	int x,y;
}a[10010];
int hash()
{
	long long res=0,len=strlen(s);
	for(int i=0;i<len;i++)
	{
		res=res*base+s[i]+prime;
		res%=mod;
	}
	return res;
}
int hash2()
{
	long long res=0,len=strlen(s);
	for(int i=0;i<len;i++)
	{
		res=res*base2+s[i]+prime2;
		res%=mod2;
	}
	return res;
}
int cmp(node x,node y)
{
	return x.x<y.x;
}
int main()
{
	scanf("%lld",&n);
	for(int i=1;i<=n;i++)
	{
		cin>>s;
		a[i].x=hash();
		a[i].y=hash2();
	}
	sort(a+1,a+n+1,cmp);
	for(int i=1;i<=n;i++)
	{
		if(a[i].x!=a[i-1].x&&a[i].y!=a[i-1].y)
		{
			ans++;
		}
	}
	cout<<ans;
} 

矩阵哈希:这道题

#include<bits/stdc++.h>
#define LL long long
using namespace std;
set<int>s;
int p1=31,p2=59,POW=1;
int N,M,n,m,Qnum;
int h[1010][1010];
char str[1010];
int Hash(int x,int y)
{
    return h[x][y]-h[x][y-m]*POW;
}
int main()
{
	//freopen("matrix.in","r",stdin);
	//freopen("matrix.out","w",stdout);
    scanf("%d%d%d%d",&N,&M,&n,&m);
    for(int i=1;i<=N;i++)
    {
        scanf("%s",str+1);
        for(int j=1;j<=M;j++)
        {
            h[i][j]=h[i][j-1]*p1+str[j];
        }
    }
    for(int i=1;i<=m;i++)
    {
        POW*=p1;
    }
    for(int i=n;i<=N;i++)
    {
        for(int j=m;j<=M;j++)
        {
            int ll=0;
            for(int k=i-n+1;k<=i;k++)
            {
                ll=ll*p2+Hash(k,j);
            }
            s.insert(ll);
        }
    }
    scanf("%d",&Qnum);
    for(int cjw_score=1;cjw_score<=Qnum;cjw_score++)
    {
        int check=0;
        for(int i=1;i<=n;i++)
        {
            int ll=0;
            scanf("%s",str+1);
            for(int j=1;j<=m;j++)
            {  
                ll=ll*p1+str[j];
            }
            check=check*p2+ll;
        }
        if(s.find(check)!=s.end())
        {
            cout<<1<<endl;
        }
        else
        {
            int X=*s.end();
            if(X==check)
            {
                cout<<1<<endl;
                continue;
            }
            cout<<0<<endl;
        }
    }
    return 0;
}
posted @ 2019-07-17 11:02  G_A_TS  阅读(429)  评论(1编辑  收藏  举报