hdu 4080 Stammering Aliens 二分 hash
2014-01-11 21:26
447 查看
POJ 3882 TLE 需后缀数组
------------
------------
------------
const int SEED = 13331; const int MAX_N = 50000 + 10; char s[MAX_N]; struct HASH{ ULL H[MAX_N]; ULL XL[MAX_N]; int len; HASH(){} void build(char *s){ len=strlen(s); H[len]=0; XL[0]=1; for (int i=len-1;i>=0;i--){ H[i]=H[i+1]*SEED+s[i]; XL[len-i]=XL[len-i-1]*SEED; } } ULL hash(int i,int L){ return H[i]-H[i+L]*XL[L]; } }hs; int n,m; ULL a[MAX_N]; int id[MAX_N]; int idx; bool cmp(int x,int y){ if (a[x]==a[y]) return x<y; return a[x]<a[y]; } bool C(int L) { int cnt=0,sum=1; idx=-1; for (int i=0;i+L<=n;i++) { a[cnt]=hs.hash(i,L); id[cnt++]=i; } sort(id,id+cnt,cmp); for (int i=1;i<cnt;i++) { if (a[id[i]]==a[id[i-1]]) { sum++; if (sum>=m) idx=max(idx,id[i]); } else sum=1; } return idx>=0; } int main(){ while (~scanf("%d",&m)) { if (m==0) break; scanf("%s",s); hs.build(s); n=strlen(s); if(m==1) { printf("%d %d\n",n,0); continue; } if(!C(1)) { printf("none\n"); continue; } int l=1,r=n; int ans=0; while (l<=r) { int mid=(l+r)>>1; if (C(mid)) { ans=mid; l=mid+1; } else r=mid-1; } C(ans); if (ans==0) printf("none\n"); else printf("%d %d\n",ans,idx); } return 0; }
------------
相关文章推荐
- P2P网贷投资须谨防圈钱人
- hdu 4080 Stammering Aliens 二分 hash
- CentOS6.5安装nginx1.5.8时出现“cp: "conf/koi-win" 与"/usr/local/nginx/conf/koi-win" 为同一文件”的解决方法
- s是大于1的正整数的非空有限集合
- 排序技术_各种算法原理 图解 代码实现
- python,iterator,fp,itertools
- C++ 记事本: 从历史说起
- J2EE的13个技术规范
- 十步完全理解SQL
- 苹果5港行和大陆行货的区别
- windows 系统下java环境配置
- java 和 xml的处理
- window.name 跨域数据传输
- Leetcode: N-Queens
- 读书笔记:算法导论第1章
- windows下配置gvim
- Spring3.0 详解
- STM32的串口采用DMA方式接收数据测试
- Ubuntu操作基本快捷键
- 程序员面试宝典(三)P107