bzoj 2081 [Poi2010]Beads
2017-06-16 10:19
218 查看
2081: [Poi2010]Beads
Time Limit: 10 Sec Memory Limit: 259 MB
Submit: 687 Solved: 246
[Submit][Status][Discuss]
Description
Zxl有一次决定制造一条项链,她以非常便宜的价格买了一长条鲜艳的珊瑚珠子,她现在也有一个机器,能把这条珠子切成很多块(子串),每块有k(k>0)个珠子,如果这条珠子的长度不是k的倍数,最后一块小于k的就不要拉(nc真浪费),保证珠子的长度为正整数。 Zxl喜欢多样的项链,为她应该怎样选择数字k来尽可能得到更多的不同的子串感到好奇,子串都是可以反转的,换句话说,子串(1,2,3)和(3,2,1)是一样的。写一个程序,为Zxl决定最适合的k从而获得最多不同的子串。 例如:这一串珠子是: (1,1,1,2,2,2,3,3,3,1,2,3,3,1,2,2,1,3,3,2,1), k=1的时候,我们得到3个不同的子串: (1),(2),(3) k=2的时候,我们得到6个不同的子串: (1,1),(1,2),(2,2),(3,3),(3,1),(2,3) k=3的时候,我们得到5个不同的子串: (1,1,1),(2,2,2),(3,3,3),(1,2,3),(3,1,2) k=4的时候,我们得到5个不同的子串: (1,1,1,2),(2,2,3,3),(3,1,2,3),(3,1,2,2),(1,3,3,2)
Input
共有两行,第一行一个整数n代表珠子的长度,(n<=200000),第二行是由空格分开的颜色ai(1<=ai<=n)。
Output
也有两行,第一行两个整数,第一个整数代表能获得的最大不同的子串个数,第二个整数代表能获得最大值的k的个数,第二行输出所有的k(中间有空格)。
Sample Input
21
1 1 1 2 2 2 3 3 3 1 2 3 3 1 2 2 1 3 3 2 1
Sample Output
6 1
2
HINT
Source
[Submit][Status][Discuss]
HOME Back
嗯就是这样…哈希再套个map…虽然复杂度到了O(nlog^2),但还是能勉强卡过
Time Limit: 10 Sec Memory Limit: 259 MB
Submit: 687 Solved: 246
[Submit][Status][Discuss]
Description
Zxl有一次决定制造一条项链,她以非常便宜的价格买了一长条鲜艳的珊瑚珠子,她现在也有一个机器,能把这条珠子切成很多块(子串),每块有k(k>0)个珠子,如果这条珠子的长度不是k的倍数,最后一块小于k的就不要拉(nc真浪费),保证珠子的长度为正整数。 Zxl喜欢多样的项链,为她应该怎样选择数字k来尽可能得到更多的不同的子串感到好奇,子串都是可以反转的,换句话说,子串(1,2,3)和(3,2,1)是一样的。写一个程序,为Zxl决定最适合的k从而获得最多不同的子串。 例如:这一串珠子是: (1,1,1,2,2,2,3,3,3,1,2,3,3,1,2,2,1,3,3,2,1), k=1的时候,我们得到3个不同的子串: (1),(2),(3) k=2的时候,我们得到6个不同的子串: (1,1),(1,2),(2,2),(3,3),(3,1),(2,3) k=3的时候,我们得到5个不同的子串: (1,1,1),(2,2,2),(3,3,3),(1,2,3),(3,1,2) k=4的时候,我们得到5个不同的子串: (1,1,1,2),(2,2,3,3),(3,1,2,3),(3,1,2,2),(1,3,3,2)
Input
共有两行,第一行一个整数n代表珠子的长度,(n<=200000),第二行是由空格分开的颜色ai(1<=ai<=n)。
Output
也有两行,第一行两个整数,第一个整数代表能获得的最大不同的子串个数,第二个整数代表能获得最大值的k的个数,第二行输出所有的k(中间有空格)。
Sample Input
21
1 1 1 2 2 2 3 3 3 1 2 3 3 1 2 2 1 3 3 2 1
Sample Output
6 1
2
HINT
Source
[Submit][Status][Discuss]
HOME Back
【分析】
题不是很难…应用到调和级数和哈希嗯就是这样…哈希再套个map…虽然复杂度到了O(nlog^2),但还是能勉强卡过
【代码】
//bzoj 2081 beads #include<bits/stdc++.h> #define ll unsigned long long #define fo(i,j,k) for(i=j;i<=k;i++) using namespace std; const int mxn=200005; map <ll,bool> mp; int ans[mxn],a[mxn]; int n,num,tot,mx,calc; ll hs[mxn],pw[mxn],ano[mxn]; inline int read() { int x=0;char ch=getchar(); while(ch<'0'||ch>'9') ch=getchar(); while(ch>='0'&&ch<='9') x=(x<<1)+(x<<3)+ch-'0',ch=getchar(); return x; } int main() { int i,j,k; n=read(),pw[0]=ano[n+1]=1; fo(i,1,n) { a[i]=read(); hs[i]=hs[i-1]*(n+1)+a[i]; pw[i]=pw[i-1]*(n+1); } for(i=n;i>=1;i--) ano[i]=ano[i+1]*(n+1)+a[i]; fo(k,1,n) { tot=0,mp.clear(); for(i=k;i<=n;i+=k) { ll now=hs[i]-hs[i-k]*pw[k]; ll tmp=ano[i-k+1]-ano[i+1]*pw[k]; if(mp.count(now) || mp.count(tmp)) continue; mp[now]=true,tot++; } ans[k]=tot,mx=max(mx,tot); } // fo(i,1,n) printf("test=%d\n",ans[i]); fo(i,1,n) if(ans[i]==mx) num++; printf("%d %d\n",mx,num); fo(i,1,n) if(ans[i]==mx) { calc++; printf("%d",i); if(calc<num) printf(" "); } puts(""); return 0; }
相关文章推荐
- BZOJ 2081 [Poi2010]Beads 哈希
- BZOJ2081 : [Poi2010]Beads
- BZOJ_2081_[Poi2010]Beads_哈希
- [BZOJ 2081]POI 2010 Beads
- 【BZOJ2081】[Poi2010]Beads hash+调和级数
- [bzoj2081][POI2010]KOR-Beads(hash)
- [BZOJ2081][POI2010]Beads(hash)
- BZOJ2081 [Poi2010]Beads
- bzoj 2081: [Poi2010]Beads 哈希
- bzoj 2081 [Poi2010]Beads 枚举+哈希
- BZOJ 2081 [Poi2010] Beads
- 【bzoj2081】[Poi2010]Beads
- BZOJ2081: [Poi2010]Beads
- bzoj 2081: [Poi2010]Beads
- 【bzoj2081】[Poi2010]Beads Hash
- 2081: [Poi2010]Beads
- BZOJ 2081 Poi2010 Beads Hash
- 【BZOJ2081】【Poi2010(17th)】Beads RKhash+hash表 请记住这个神一样的数:200019
- BZOJ 2081 [Poi2010]Beads hash
- BZOJ2084: [Poi2010]Antisymmetry