BZOJ 2081 [Poi2010]Beads 哈希
2017-03-21 09:38
274 查看
题目大意:给出一个长为n的数字串,将串分块,块的大小可为[1,n]内的任意整数。每块中的串必须完整,块内的串可以翻转,求不同的串的个数
枚举块大小哈希暴力就好。根据调和级数时间复杂度为O(nlogn)
这题卡模数,自己试了一些都不行
最后直接照alone_wolf抄了一波 BASE=2333,MOD=98754321 可以过
枚举块大小哈希暴力就好。根据调和级数时间复杂度为O(nlogn)
这题卡模数,自己试了一些都不行
最后直接照alone_wolf抄了一波 BASE=2333,MOD=98754321 可以过
#include <cstdio> #include <map> #define N 200005 using namespace std; typedef unsigned long long ULL; const ULL MOD=98754321,BASE=2333; map<ULL,int> Hash; ULL fac ={1},pre ,suf ; int n,s ,ans ,top,maxx; int main() { scanf("%d",&n); ULL tmp=0; for(int i=1;i<=n;i++) { fac[i]=fac[i-1]*BASE%MOD; scanf("%d",s+i); pre[i]=(pre[i-1]*BASE+s[i])%MOD; } for(int i=n;i;i--) suf[i]=(suf[i+1]*BASE+s[i])%MOD; for(int i=1;i*maxx<=n;i++) { Hash.clear(); for(int j=1;j+i-1<=n;j+=i) { int l=j,r=j+i-1; ULL prehash=(pre[r]-pre[l-1]*fac[r-l+1]%MOD+MOD)%MOD; ULL sufhash=(suf[l]-suf[r+1]*fac[r-l+1]%MOD+MOD)%MOD; if(!Hash.count(prehash) || !Hash.count(sufhash)) { ans[i]++; Hash[prehash]=1; Hash[sufhash]=1; } } if(ans[i]>maxx) maxx=ans[i], top=0; if(ans[i]==maxx) s[++top]=i; } printf("%d %d\n",maxx,top); for(int i=1;i<top;i++) printf("%d ",s[i]); printf("%d\n",s[top]); return 0; }
相关文章推荐
- BZOJ_2081_[Poi2010]Beads_哈希
- bzoj 2081: [Poi2010]Beads 哈希
- bzoj 2081 [Poi2010]Beads 枚举+哈希
- 【bzoj2081】[Poi2010]Beads Hash
- [BZOJ2081][POI2010]Beads(hash)
- BZOJ2081 : [Poi2010]Beads
- BZOJ2081: [Poi2010]Beads
- bzoj 2081 [Poi2010]Beads
- BZOJ2081 [Poi2010]Beads
- bzoj 2081: [Poi2010]Beads
- 【BZOJ2081】[Poi2010]Beads hash+调和级数
- [bzoj2081][POI2010]KOR-Beads(hash)
- 【bzoj2081】[Poi2010]Beads
- BZOJ 2081 [Poi2010] Beads
- [BZOJ 2081]POI 2010 Beads
- 【二分答案】【字符串哈希】bzoj2084 [Poi2010]Antisymmetry
- 2081: [Poi2010]Beads
- BZOJ 2081 Poi2010 Beads Hash
- 【BZOJ2081】【Poi2010(17th)】Beads RKhash+hash表 请记住这个神一样的数:200019
- BZOJ2081: [Poi2010]Beads 哈希