码迷,mamicode.com
首页 > 其他好文 > 详细

The Preliminary Contest for ICPC Asia Shanghai 2019 G. Substring (滑窗+哈希)

时间:2019-09-16 21:58:33      阅读:142      评论:0      收藏:0      [点我收藏+]

标签:ant   while   hash   答案   sign   printf   style   arch   arc   

 

G. Substring

 

 

一直超时or超内存

然后一直改一直改 然后 是 答案错误

然后 然后 最后结论是哈希姿势不对

 

我在别的地方找了这个:

//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]++;

 

然后......  哎

 

思路就是题解的思路。

 

 

一直超时超内存

 

结果做出来:3368ms 2132kb

题目给的是: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\n",mp[anshs[i]]-1);
        mp.clear();
    }
}

 

 

 

哎...

 

The Preliminary Contest for ICPC Asia Shanghai 2019 G. Substring (滑窗+哈希)

标签:ant   while   hash   答案   sign   printf   style   arch   arc   

原文地址:https://www.cnblogs.com/kkkek/p/11529899.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!