• 【积累】The Preliminary Contest for ICPC Asia Shanghai 2019 G. Substring (滑窗+哈希)


    G. Substring

    一直超时 超内存

    然后 是 答案错误

    最后发现主要是哈希的问题

    我在别的地方找了这个:

    //https://www.cnblogs.com/napoleon_liu/archive/2010/12/29/1920839.html
    
    uint32_t hash( uint32_t a)
    {
       a = (a+0x7ed55d16) + (a<<12);
       a = (a^0xc761c23c) ^ (a>>19);
       a = (a+0x165667b1) + (a<<5);
       a = (a+0xd3a2646c) ^ (a<<9);
       a = (a+0xfd7046c5) + (a<<3); // 
       a = (a^0xb55a4f09) ^ (a>>16); 
       return a;
    }

    然后借用这个 我改了改

    一开始用龙龙没用unsigned  然后就答案错误

    哎 吸取教训

    然后  以前一直没意识到这件事

    //超内存:
    if(mp[x])mp[x]++;
    //不会超内存
    if(mp.count(x))mp[x]++;

    然后......  哎

    思路就是题解的思路。

    结果做出来:3226ms 1656kb

    题目给的是:10000ms 20480kb

    #include<bits/stdc++.h>
    #include<tr1/unordered_map>
    #define debug printf("!");
    using namespace std;
    typedef long long ll;
    typedef unsigned long long ull;
    const int maxn=1e5+50;
    const int inf=0x3f3f3f3f;
    
    inline ull Gh(ull a)
    {
        a+=14271;
        a=(a+0x7ed55d16)+(a<<12);
        a=(a^0xc761c23c)^(a>>19);
        a=(a+0x165667b1)+(a<<5);
        a=(a+0xd3a2646c)^(a<<9);
        a=(a+0xfd7046c5)+(a<<3);
        a=(a^0xb55a4f09)^(a>>16); 
        return a;
    }
    
    inline ull Lh(ull a)
    {
        a=Gh(a*INT_MAX);
        a=(a+0x7ecc5d16)+(a<<13);
        a=(a^0xc761c89c)^(a>>17);
        a=(a+0x315667b1)+(a<<7);
        a=(a+0xdfa26a6c)^(a<<11);
        a=(a+0xfd7b4aa5)+(a<<5);
        a=(a^0xb59b4e09)^(a>>12); 
        return Gh(a);
    }
    inline ull Rh(ull a)
    {
        a=Gh(a*a+31313);
        a=(a+0x8bd45d31)+(a<<16);
        a=(a^0x24bad623)^(a>>15);
        a=(a+0x971bfa3b)+(a<<7);
        a=(a+0x12abf315)^(a<<4);
        a=(a+0x2e4174bd)+(a<<7);
        a=(a^0xac5baef5)^(a>>14); 
        return Gh(a);
    }
    
    char s[maxn],ts[maxn];
    tr1::unordered_map<ull,int> mp;
    ull anshs[20002];
    int veclen[20002];
    ull h;
    
    int main()
    {
        int T;
        scanf("%d",&T);
        while(T--)
        {    
            ll tlen;
            ull L,R,u,u1,u2,unext,chcut,chadd;
            int m,i,j,w,len,nextlen,up,tot=0;
            scanf("%s",s);
            len=strlen(s);
            scanf("%d",&m);
            for(i=0;i<m;i++)
            {
                scanf("%s",ts);
                tlen=strlen(ts);
                L=ts[0]-'a';R=ts[tlen-1]-'a';
                
                h=Lh(L)+Rh(R);
                for(j=0;j<tlen;j++)
                {
                    u=ts[j]-'a';
                    h=h+Gh(u);
                }
                mp[h]=1;
                anshs[i]=h;
                veclen[i]=tlen;
            }
            sort(veclen,veclen+m);
            up=unique(veclen,veclen+m)-veclen;
            L=s[0]-'a';R=s[veclen[0]-1]-'a';
            unext=0;
            for(j=0;j<veclen[0];j++)
            {
                u=s[j]-'a';
                unext=unext+Gh(u);
            }
            for(w=0;w<up;w++)
            {
                tlen=veclen[w];
                nextlen=veclen[w+1];
                if(tlen>len)break;
                for(j=0;j+tlen-1<len;j++)//长度滑窗 
                {
                    L=s[j]-'a';R=s[j+tlen-1]-'a';
                    u1=Lh(L)+Rh(R);
                    if(!j)u=unext;
                    else
                    {
                        chcut=s[j-1]-'a';
                        chadd=R;
                        if(j+tlen-1<nextlen)
                        {
                            unext=unext+Gh(R);
                        }
                        u=u-Gh(chcut)+Gh(chadd);
                    }
                    if(mp.count(u+u1))mp[u+u1]++;
                }
            }
            for(i=0;i<m;i++)printf("%d
    ",mp[anshs[i]]-1);
            mp.clear();
        }
    }

    哎...

  • 相关阅读:
    自动机
    C语言文法
    实验报告一:词法分析
    Python的基础综合练习
    Python基础综合练习
    turtle画五星红旗
    熟悉常用的Linux操作
    大数据概述
    对学习编译原理的看法
    LINUX
  • 原文地址:https://www.cnblogs.com/kkkek/p/11529899.html
Copyright © 2020-2023  润新知