hash练习

时间:2024-10-06 13:35:08
/*
poj 1200 Crazy Search
字符串hash O(n)枚举起点
然后O(1)查询子串hash值
然后O(n)找不一样的个数
复杂度是线性的
*/
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#define P 29
#define maxn 1000010
using namespace std;
int n,c,len,p[maxn],ha[maxn],tot,hash[maxn],ans;
char s[maxn];
void Get_p(){
p[]=;
for(int i=;i<=n;i++)
p[i]=p[i-]*P;
}
void Get_ha(){
len=strlen(s+);
for(int i=;i<=len;i++)
ha[i]=ha[i-]*P+s[i]-'a';
}
int Query(int l,int r){
return ha[r]-ha[l-]*p[r-l+];
}
void Solve(){
for(int l=;l+n-<=len;l++){
int r=l+n-;
hash[++tot]=Query(l,r);
}
sort(hash+,hash++tot);
for(int i=;i<=tot;i++)
if(hash[i]!=hash[i-])ans++;
}
int main()
{
scanf("%d%d%s",&n,&c,s+);
Get_p();Get_ha();Solve();
printf("%d\n",ans);
return ;
}
/*
poj 2503 Babelfish
*/
#include<iostream>
#include<cstdio>
#include<cstring>
#define maxn 100010
#define P 19
#define mod 10007
using namespace std;
int head[maxn],num;
struct node{
int pre;
char v[],u[];
}e[maxn*];
char lan[maxn][],s[];
int Get(char *a){
int r=,len=strlen(a);
for(int i=;i<len;i++){
r=r*P+a[i]-'a';r%=mod;
}
return r;
}
void Insert(char *a,char *b){
int x=Get(a);
num++;e[num].pre=head[x];
strcpy(e[num].v,b);
strcpy(e[num].u,a);
head[x]=num;
}
int find(char *a){
int x=Get(a);
for(int i=head[x];i;i=e[i].pre)
if(!strcmp(e[i].u,a)){
puts(e[i].v);
return ;
}
return ;
}
int main()
{
while(){
gets(s);
if(s[]=='\0')break;
int len=strlen(s),l1=-,l2=-,k;
char a[],b[];
memset(a,,sizeof(a));
memset(b,,sizeof(b));
for(int i=;i<len;i++)
if(s[i]==' '){k=i+;break;}
else a[++l1]=s[i];
for(int i=k;i<len;i++)
b[++l2]=s[i];
Insert(b,a);
}
while(~scanf("%s",s)){
int p=find(s);
if(!p)printf("eh\n");
}
return ;
}