• poj 2774 字符串哈希求最长公共子串


    Long Long Message

    #include <iostream>
    #include <algorithm>
    #include <cstdio>
    #include <cstdlib>
    #include <cstring>
    #include <queue>
    #include <stack>
    #include <cmath>
    #include <map>
    #include <string>
    #define LL long long
    #define ULL unsigned long long
    
    using namespace std;
    const int N = 1e5+10;
    
    ULL hash1[N],hash2[N],p[N];
    int seed = 131;
    char sa[N],sb[N];
    
    void init()
    {
        p[0] = 1;
        for(int i = 1; i <= 100000; i++)
        {
            p[i] = p[i-1]*seed;
        }
    }
    
    void hashs(char s[],ULL hashn[])
    {
        int len = strlen(s+1);
        hashn[0] = 0;
        hashn[1] = s[1]-'A'+1;
        for(int i = 2; i <= len; i++)
            hashn[i] = hashn[i-1]*seed + (s[i]-'A'+1);
    }
    
    ULL getHash(int pos,int len, ULL hashn[])   //获取pos位置起长度为len的子字符串哈希值
    {
        //printf("hash: %ul
    ",hashn[pos+len-1] - hashn[pos-1]*p[len]);
        return hashn[pos+len-1] - hashn[pos-1]*p[len];
    }
    
    bool check(int len, int la,int lb)
    {
        vector<ULL> bin;
        for(int i = len; i <= la; i++)
            bin.push_back(getHash(i-len+1,len,hash1));
    
        sort(bin.begin(),bin.end());
    
        for(int i = len; i <= lb; i++)
        {
            ULL temp = getHash(i-len+1,len,hash2);
            if(binary_search(bin.begin(),bin.end(),temp))
                return true;
        }
        return false;
    }
    
    void solve()
    {
        init();
        while(~scanf("%s %s",sa+1,sb+1))
        {
            hashs(sa,hash1);
            hashs(sb,hash2);
            int la = strlen(sa+1);
            int lb = strlen(sb+1);
    
            int ans = 0;
            int lf = 1,mid;
            int rt = min(la,lb);
            while(lf <= rt)
            {
                mid = (lf+rt)/2;
                if(check(mid,la,lb))
                {
                    ans = mid;
                    lf = mid+1;
                }
                else
                {
                    rt = mid-1;
                }
            }
            printf("%d
    ",ans);
        }
    }
    
    int main(void)
    {
        solve();
    
        return 0;
    }
    
    
  • 相关阅读:
    springmvc学习:处理方法返回值的可选类型
    【MongoDB for Java】Java操作MongoDB
    过滤器与拦截器
    摘录
    struts2中运用通配符(边学边记)
    微信:一款软件带起的微时代营销
    Php连接mysql处理中文乱码
    dui xiang yin yong
    hibernate数据的三种存在状态(只与事务有关)
    session机制
  • 原文地址:https://www.cnblogs.com/henserlinda/p/11738566.html
Copyright © 2020-2023  润新知