博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
BZOJ3752 : Hack
阅读量:6655 次
发布时间:2019-06-25

本文共 949 字,大约阅读时间需要 3 分钟。

折半爆搜,首先爆搜出所有长度不超过$4$的串。

对于每个询问,首先暴力枚举所有长度不超过$4$的串,以及前$4$位相同时后面的串。

然后枚举前$4$位,以及后面的串长,那么后面的hash值唯一,可以双指针求出。

时间复杂度$O(26^4(\log(26^4)+k))$。

 

#include
#include
#include
typedef long long ll;typedef unsigned int U;const int N=460000;const ll inf=1LL<<60;int seed,L,Q,ansl,sl;U H,mul[4];ll ans,ss,po[8];struct P{U h;int s;P(){}P(U _h,int _s){h=_h,s=_s;}};inline bool cmpa(const P&x,const P&y){return x.h
ans)return; if(x
4&&sl<=L){ U tmp=0;ll t=0; for(i=0;i<4;i++)tmp=tmp*seed+s[i],t+=po[7-i]*(s[i]-'A'); tmp*=mul[sl-4]; for(j=1;j<=C[sl-4].n;j++)if(tmp+C[sl-4].a[j].h==H)up(t+C[sl-4].a[j].s,sl); } for(i=1;i<=4&&i+4<=L;i++){ U o=~0U; for(j=1,k=B[i].n;j<=A[i].n;j++){ U t=H-A[i].a[j].h; if(t>o)k=B[i].n; o=t; while(k&&B[i].a[k].h>t)k--; if(k&&B[i].a[k].h==t)up(1LL*po[4]*A[i].a[j].s+B[i].a[k].s,i+4); } } if(ans==inf)puts("-1"); else{ for(i=0;i

  

转载地址:http://cfxto.baihongyu.com/

你可能感兴趣的文章