The Preliminary Contest for ICPC Asia Shanghai 2019 G. Substring (滑窗+哈希)
Posted kkkek
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了The Preliminary Contest for ICPC Asia Shanghai 2019 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 (滑窗+哈希)的主要内容,如果未能解决你的问题,请参考以下文章
The Preliminary Contest for ICPC Asia Yinchuan 2019
The Preliminary Contest for ICPC Asia Shenyang 2019
The Preliminary Contest for ICPC Asia Shanghai 2019
The Preliminary Contest for ICPC Asia Shanghai 2019