BZOJ2081: [Poi2010]Beads
2016-09-07 15:15
435 查看
题目大意:给一个数串,求出在每段长度为i(1<=i<=n)的情况下,有多少个翻转不同的段,输出最大值、个数,以及所有的段长
根据调和级数,枚举所有的长度,总段数是O(NlogN)级别的
所以判重我们可以用hash和map,这样就可以在O(Nlogn^2)时间内出解
PS:base设成233就WA,2333就过了真是厉害
根据调和级数,枚举所有的长度,总段数是O(NlogN)级别的
所以判重我们可以用hash和map,这样就可以在O(Nlogn^2)时间内出解
PS:base设成233就WA,2333就过了真是厉害
#include<iostream> #include<cstdio> #include<cstring> #include<algorithm> #include<map> #define N 200010 using namespace std; int a ,h ,g ,cf ; int base=233,mod=98754321; int ans ; map<int,bool>p; int geth(int x,int y) { x--; return ((h[y]-(long long)h[x]*cf[y-x]%mod)+mod)%mod; } int getg(int x,int y) { y++; return ((g[x]-(long long)g[y]*cf[y-x]%mod)+mod)%mod; } int main() { int n; scanf("%d",&n); int i,j,x,y; cf[0]=1; for(i=1;i<=n;i++) cf[i]=(long long)cf[i-1]*base%mod; for(i=1;i<=n;i++) { scanf("%d",&a[i]); h[i]=((long long)h[i-1]*base+a[i])%mod; } for(i=n;i>=1;i--) g[i]=((long long)g[i+1]*base+a[i])%mod; int maxn=0,tot=0; for(i=1;maxn*i<=n;i++) { p.clear(); int now=0; for(j=1;j+i-1<=n;j+=i) { int h1=geth(j,j+i-1),h2=getg(j,j+i-1); if(!p[h1]||!p[h2]) { now++; p[h1]=p[h2]=true; } } if(now>maxn) { maxn=now; tot=1; ans[1]=i; } else if(now==maxn) { tot++; ans[tot]=i; } } printf("%d %d\n%d",maxn,tot,ans[1]); for(i=2;i<=tot;i++) printf(" %d",ans[i]); }
相关文章推荐
- 【bzoj2081】[Poi2010]Beads Hash
- BZOJ 2081 [Poi2010]Beads 哈希
- 【BZOJ2081】[Poi2010]Beads hash+调和级数
- [bzoj2081][POI2010]KOR-Beads(hash)
- BZOJ2081 [Poi2010]Beads
- [BZOJ2081][POI2010]Beads(hash)
- bzoj 2081: [Poi2010]Beads 哈希
- bzoj 2081 [Poi2010]Beads 枚举+哈希
- [BZOJ 2081]POI 2010 Beads
- BZOJ2081 : [Poi2010]Beads
- BZOJ 2081 [Poi2010] Beads
- 【bzoj2081】[Poi2010]Beads
- bzoj 2081 [Poi2010]Beads
- bzoj 2081: [Poi2010]Beads
- BZOJ_2081_[Poi2010]Beads_哈希
- BZOJ 2081 [Poi2010]Beads hash
- 2081: [Poi2010]Beads
- BZOJ 2081 Poi2010 Beads Hash
- 【BZOJ2081】【Poi2010(17th)】Beads RKhash+hash表 请记住这个神一样的数:200019
- 【BZOJ2081】Beads(哈希表)