hash练习

/*
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[0]=1;
    for(int i=1;i<=n;i++)
        p[i]=p[i-1]*P;
}
void Get_ha(){
    len=strlen(s+1);
    for(int i=1;i<=len;i++)
        ha[i]=ha[i-1]*P+s[i]-'a';
}
int Query(int l,int r){
    return ha[r]-ha[l-1]*p[r-l+1];
}
void Solve(){
    for(int l=1;l+n-1<=len;l++){
        int r=l+n-1;    
        hash[++tot]=Query(l,r);
    }
    sort(hash+1,hash+1+tot);
    for(int i=1;i<=tot;i++)
        if(hash[i]!=hash[i-1])ans++;
}
int main()
{
    scanf("%d%d%s",&n,&c,s+1);
    Get_p();Get_ha();Solve();
    printf("%d\n",ans);
    return 0;
}
/*
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[110],u[110];
}e[maxn*2];
char lan[maxn][110],s[210];
int Get(char *a){
    int r=0,len=strlen(a);
    for(int i=0;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 1;
        }
    return 0;
}
int main()
{
    while(1){
        gets(s);
        if(s[0]=='\0')break;
        int len=strlen(s),l1=-1,l2=-1,k;
        char a[110],b[110];
        memset(a,0,sizeof(a));
        memset(b,0,sizeof(b));
        for(int i=0;i<len;i++)
            if(s[i]==' '){k=i+1;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 0;
}

 

posted @ 2016-09-10 11:25  一入OI深似海  阅读(299)  评论(0编辑  收藏  举报