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(); } }
哎...
标签:return,滑窗,Contest,int,Shanghai,long,mp,ull,Gh 来源: https://www.cnblogs.com/kkkek/p/11529899.html