为什么哈希表没有不判冲突的哈希分高啊= =

P3498 [POI2010] KOR-Beads

```cpp #include<vector> #include<cstdio> using namespace std; const int p=10007,q=1500007,N=2e5+5; typedef unsigned long long ul; ul r[N],s[N],t[N];/*,v[1500010];int l[1500010],*/int a[N],e[N],g; vector<pair<int,ul> > l[1500010]; int main(){ int n,z,o=0;ul y;scanf("%d",&n);t[0]=1; for(int i=1;i<=n;++i) scanf("%d",&a[i]),t[i]=t[i-1]*p,r[i]=r[i-1]*p+a[i]; for(int i=n;i;--i) s[i]=s[i+1]*p+a[i]; for(int i=1,k;i<=n;++i){ k=0; for(int j=1,x;j+i<n;j+=i){ /*x=j+i-1;y=r[x]-r[j-1]*t[i],z=s[j]-s[x+1]*t[i]; if(l[y%q]!=i || l[z%q]!=i || v[y%q]!=y || v[z%q]!=z) ++k,l[y%q]=l[z%q]=i,v[y%q]=y,v[z%q]=z;*/ x=j+i-1;y=min(r[x]-r[j-1]*t[i],s[j]-s[x+1]*t[i]);z=y%q;x=-1; for(int h=l[z].size();h--;) if(l[z][h].second==y){x=h;break;} if(x==-1) ++k,l[z].push_back(make_pair(i,y)); else if(l[z][x].first!=i) ++k,l[z][x].first=i; } if(k>o) o=k,e[g=1]=i; else if(k==o) e[++g]=i; } printf("%d %d\n",o,g); for(int i=1;i<=g;++i) printf("%d ",e[i]); return 0; } ```
by 星小雨 @ 2018-10-20 14:56:39


|