zoukankan      html  css  js  c++  java
  • 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
    ",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]=='')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
    ");
        }
        return 0;
    }
  • 相关阅读:
    Redis集群(一)
    Mysql分库分表
    Redisson分布式锁
    Spring Cloud Eureka 高可用
    Spring RestTemplate具备负载均衡功能
    Redis分布式锁
    B树/B-树/B+树/B*树的数据库应用
    ABAC访问控制模型
    Maven自定义打包的包名
    Versions maven plugin 修改版本
  • 原文地址:https://www.cnblogs.com/yanlifneg/p/5859062.html
Copyright © 2011-2022 走看看