zoukankan      html  css  js  c++  java
  • 请教神牛_字符串hash

        针对字符串hash 我早就听闻可以暴力的干一些事情。

    比如 可以...

    很多很多 实现O(n)求出 模式串在文本串出现的次数。

    但是我不会这什么hash。

    我会自然溢出字符串hash 嘿嘿 unsigned long long 溢出后可以 对2^32自动取%

    采用p进制字符串hash 我想出现冲突的可能性是 99%

    这道题呢 采用map 可以快速A但是hash 也是可以取得不错的效果的。

    我想 可以随便搞了。sort稳重操作!

    //#include<bits/stdc++.h>
    #include<iostream>
    #include<cstdio>
    #include<iomanip>
    #include<cstring>
    #include<string>
    #include<cstdlib>
    #include<cmath>
    #include<algorithm>
    #include<cctype>
    #include<utility>
    #include<set>
    #include<bitset>
    #include<queue>
    #include<stack>
    #include<deque>
    #include<map>
    #include<vector>
    #include<ctime>
    #define INF 168430090
    #define mod 19260817
    #define ull unsigned long long
    using namespace std;
    char buf[1<<15],*fs,*ft;
    inline char getc()
    {
        return (fs==ft&&(ft=(fs=buf)+fread(buf,1,1<<15,stdin),fs==ft))?0:*fs++;
    }
    inline int read()
    {
        int x=0,f=1;char ch=getchar();
        while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
        while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}
        return x*f;
    }
    inline void put(int x)
    {
        x<0?putchar('-'),x=-x:0;
        int num=0;char ch[50];
        while(x)ch[++num]=x%10+'0',x/=10;
        num==0?putchar('0'):0;
        while(num)putchar(ch[num--]);
        putchar('
    ');return;
    }
    const int MAXN=500,maxn=50002;
    int n,ans,c[maxn];
    char a[MAXN];
    struct wy
    {
        ull b;
        int id;
        friend int operator <(const wy &x,const  wy &y)
        {
            if(x.b==y.b)return x.id<y.id;
            return x.b<y.b;
        }
    }t[maxn];
    int main()
    {
        //freopen("1.in","r",stdin);
        n=read();
        for(int i=1;i<=n;i++)
        {
            scanf("%s",a+1);
            int len=strlen(a+1);
            t[i].id=i;
            for(int j=1;j<=len;j++)t[i].b=t[i].b*mod+a[j];
        }
        sort(t+1,t+1+n);
        for(int i=2;i<=n;i++)if(t[i].b==t[i-1].b)c[t[i].id]=1;
        for(int i=1;i<=n;i++)if(c[i]==1)put(i);
        return 0;
    }

    我居北海君南海,寄雁传书谢不能。

  • 相关阅读:
    Nodejs接收图片base64格式保存为文件
    tracking.js实现前端人脸识别
    node.js执行shell命令进行服务器重启
    Cordova 实现沉浸式(透明)状态栏效果
    SpringBoot启动原理详解
    连续子数组的最大乘积及连续子数组的最大和(Java)
    记录面试遇到的几个自己不太熟悉的问题(3)
    记录面试遇到的几个自己不太熟悉的问题(2)
    记录面试遇到的几个自己不太熟悉的问题(1)
    Java设计模式
  • 原文地址:https://www.cnblogs.com/chdy/p/10371841.html
Copyright © 2011-2022 走看看