BZOJ2081 : [Poi2010]Beads
2015-08-05 01:01
232 查看
暴力枚举$k$,对于一个子串,计算它正着的hash值以及反着的hash值,取最小值得到其最终hash值。
对于$k$,一共有$\lfloor\frac{n}{k}\rfloor$个子串,计算出它们的最终hash值即可统计出不同子串的个数。
时间复杂度$O(n\log n)$。
对于$k$,一共有$\lfloor\frac{n}{k}\rfloor$个子串,计算出它们的最终hash值即可统计出不同子串的个数。
时间复杂度$O(n\log n)$。
#include<cstdio> typedef long long ll; const int N=200010,P=2333333,D=1000173169,M=1048575; int n,i,j,pow ,a ,pre ,suf ,val ,ans,cnt,now; inline int min(int a,int b){return a<b?a:b;} inline int hash(int l,int r){return min((ll)(pre[r]-(ll)pre[l-1]*pow[r-l+1]%D+D)%D,(ll)(suf[l]-(ll)suf[r+1]*pow[r-l+1]%D+D)%D);} struct E{int v;E*nxt;}*g[M+1],pool ,*cur=pool,*p; int vis[M+1]; inline bool ins(int v){ int u=v&M; if(vis[u]<i)vis[u]=i,g[u]=NULL; for(p=g[u];p;p=p->nxt)if(p->v==v)return 0; p=cur++;p->v=v;p->nxt=g[u];g[u]=p; return 1; } inline void read(int&a){char c;while(!(((c=getchar())>='0')&&(c<='9')));a=c-'0';while(((c=getchar())>='0')&&(c<='9'))(a*=10)+=c-'0';} int main(){ for(read(n),pow[0]=i=1;i<=n;i++)pow[i]=(ll)pow[i-1]*P%D; for(i=1;i<=n;i++)read(a[i]); for(i=1;i<=n;i++)pre[i]=(ll)((ll)pre[i-1]*P+a[i])%D; for(i=n;i;i--)suf[i]=(ll)((ll)suf[i+1]*P+a[i])%D; for(i=1;i<=n;i++)for(cur=pool,j=i;j<=n;j+=i)if(ins(hash(j-i+1,j)))val[i]++; for(i=1;i<=n;i++)if(val[i]>ans)ans=val[i],cnt=1;else if(val[i]==ans)cnt++; for(printf("%d %d\n",ans,cnt),i=1;i<=n;i++)if(val[i]==ans){ if((++now)<cnt)printf("%d ",i); else printf("%d",i); } return 0; }
相关文章推荐
- 使用 Spring Security 保护 Web 应用的安全
- [IOS]今天开始学UI---UIAlertController
- 神奇的与(&)、非(~)、或(|)、异或(^)
- 多线程-锁的类型 && CAS 非阻塞同步
- Chang the default encoding of notepad
- BootStrap Panel
- CSS3 圆转动 特效
- 最短路_POJ_3268
- [LeetCode]Maximum Gapd
- iOS应用架构谈 开篇
- 最好最实用的二次开发教程(dedeCMS,ecshop为例)
- bzoj 1623: [Usaco2008 Open]Cow Cars 奶牛飞车
- 数据结构基础温故-6.查找(上):基本查找与树表查找
- 各种版本的ST-LINK仿真器
- inux Gsensor驱动(bma250为例子)
- MinGW-64 安装
- 欢迎使用CSDN-markdown编辑器
- POJ_3660
- Android开源:数据库ORM框架GreenDao学习心得及使用总结
- MTK6572 平台G_SEENSOR兼容