[BZOJ1717][Usaco2006 Dec]Milk Patterns 产奶的模式(后缀数组)
2016-05-11 19:12
405 查看
题目描述
传送门题解
先二分答案,然后将后缀分成若干组。判断有没有一个组的后缀个数不小于 k。如果有,那么存在k 个相同的子串满足条件,否则不存在。代码
#include<iostream> #include<cstring> #include<cstdio> using namespace std; const int max_n=2e4+5; const int max_m=1e6+5; int n,k,l,r,mid,ans,m=1e6+1; int s[max_n]; int sa[max_n],height[max_n],rank[max_n],c[max_m],x[max_n],y[max_n]; inline void build_sa() { for (int i=0;i<m;++i) c[i]=0; for (int i=0;i<n;++i) c[x[i]=s[i]]++; for (int i=1;i<m;++i) c[i]+=c[i-1]; for (int i=n-1;i>0;--i) sa[--c[x[i]]]=i; for (int k=1;k<=n;k<<=1) { int p=0; for (int i=n-k;i<n;++i) y[p++]=i; for (int i=0;i<n;++i) if (sa[i]>=k) y[p++]=sa[i]-k; for (int i=0;i<m;++i) c[i]=0; for (int i=0;i<n;++i) c[x[y[i]]]++; for (int i=1;i<m;++i) c[i]+=c[i-1]; for (int i=n-1;i>=0;--i) sa[--c[x[y[i]]]]=y[i]; swap(x,y); p=1; x[sa[0]]=0; for (int i=1;i<n;++i) x[sa[i]]=(y[sa[i-1]]==y[sa[i]]&& (sa[i-1]+k>=n?-1:y[sa[i-1]+k])==(sa[i]+k>=n?-1:y[sa[i]+k]))?p-1:p++; if (p>=n) break; m=p; } } inline void build_lcp() { for (int i=0;i<n;++i) rank[sa[i]]=i; int k=0; height[0]=0; for (int i=0;i<n;++i) { if (!rank[i]) continue; if (k) --k; int j=sa[rank[i]-1]; while (i+k<n&&j+k<n&&s[i+k]==s[j+k]) ++k; height[rank[i]]=k; } } inline bool check(int x) { int num=0; for (int i=0;i<n;++i) if (height[i]>=x) { num++; if (num==k-1) return true; } else num=0; return false; } int main() { scanf("%d%d",&n,&k); for (int i=0;i<n;++i) scanf("%d",&s[i]); build_sa(); build_lcp(); l=1; r=n; while (l<=r) { mid=(l+r)>>1; if (check(mid)) ans=mid,l=mid+1; else r=mid-1; } printf("%d\n",ans); }
相关文章推荐
- 你对“国产操作系统”怎么看?请吐槽!
- java基础之处理异常
- Code First Migrations更新数据库结构的具体步骤
- 中国互联网金融协会名单(P2P理财)
- android handler 弱引用
- Maven Java EE Configuration Problem 的完美解决办法
- 使用DBCP时发生AbstractMethodError异常
- 纸牌博弈
- 删除数据Delete 语句、Truncate 语句
- swift语言的学习笔记
- Nim游戏(一堆/N堆)-博弈
- linux常用命令
- 利用HttpClient or HttpURLConnection 借助tomcat实现在本地进行网络数据的访问
- ActionBar
- 记录用户的登录状态
- 日志管理 rsyslog服务浅析
- POJ 3601:Tower of Hanoi
- Oracle LOB
- [SDOI 2014] [JZOJ 3625] 旅行
- BZOJ3521: [Poi2014]Salad Bar