解题:USACO06DEC Milk Patterns
初见SA
用了一个常见的按$height$分组的操作:二分答案,然后按$height$分组,遇到一个$height$小于$mid$的就丢进下一组并更新答案,如果最多的那组不少于$k$个说明可行
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int N=;
int uni[N],num[N],sec[N],bkt[N];
int SA[N],rnk[N],hgt[N];
int n,k,l,r,ans,siz;
void Basenum_Sort()
{
register int i;
for(i=;i<=siz;i++) bkt[i]=;
for(i=;i<=n;i++) bkt[rnk[i]]++;
for(i=;i<=siz;i++) bkt[i]+=bkt[i-];
for(i=n;i;i--) SA[bkt[rnk[sec[i]]]--]=sec[i];
}
void Suffix_Sort()
{
register int i;
int pw=,cnt=;
Basenum_Sort();
while(cnt<n)
{
cnt=;
for(i=;i<=pw;i++) sec[++cnt]=n-pw+i;
for(i=;i<=n;i++) if(SA[i]>pw) sec[++cnt]=SA[i]-pw;
Basenum_Sort(); swap(rnk,sec); rnk[SA[]]=cnt=;
for(i=;i<=n;i++) cnt+=(sec[SA[i-]]!=sec[SA[i]]||sec[SA[i-]+pw]!=sec[SA[i]+pw]),rnk[SA[i]]=cnt;
pw<<=,siz=cnt;
}
}
void Getting_Height()
{
int p=;
for(int i=;i<=n;i++)
if(rnk[i]!=)
{
int r=SA[rnk[i]-];
while(num[r+p]==num[i+p]) p++;
hgt[rnk[i]]=p; if(p>) p--;
}
hgt[]=;
}
bool check(int x)
{
register int i;
int len=,lst=;
for(i=;i<=n;i++)
if(hgt[i]<x)
len=max(i-lst,len),lst=i;
len=max(n-lst+,len);
return len>=k;
}
int main()
{
register int i;
scanf("%d%d",&n,&k);
for(i=;i<=n;i++)
scanf("%d",&num[i]),uni[i]=num[i];
sort(uni+,uni++n),siz=unique(uni+,uni++n)-uni-;
for(i=;i<=n;i++)
rnk[i]=lower_bound(uni+,uni++siz,num[i])-uni,sec[i]=i;
Suffix_Sort(); Getting_Height(); l=,r=n;
while(l<=r)
{
int mid=(l+r)/;
if(check(mid)) ans=mid,l=mid+;
else r=mid-;
}
printf("%d",ans);
return ;
}
Upd:SAM对SA的全面替换已完成
这题丢给SAM就没啥可说的了,直接按定义来就行
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<unordered_map>
#define umap unordered_map
using namespace std;
const int N=;
umap<int,int> trs[N];
int p[N],noww[N],goal[N];
int fth[N],len[N],siz[N];
int rd,lth,kth,cnt,tot,lst,ans;
void Link(int f,int t)
{
noww[++cnt]=p[f];
goal[cnt]=t,p[f]=cnt;
}
void Insert(int ch)
{
int nde=lst,newn=++tot; lst=newn;
siz[newn]=,len[newn]=len[nde]+;
while(nde&&!trs[nde].count(ch))
trs[nde][ch]=newn,nde=fth[nde];
if(!nde) fth[newn]=;
else
{
int tran=trs[nde][ch];
if(len[tran]==len[nde]+)
fth[newn]=tran;
else
{
int rnde=++tot;
len[rnde]=len[nde]+,trs[rnde]=trs[tran];
fth[rnde]=fth[tran],fth[tran]=fth[newn]=rnde;
while(nde&&trs[nde][ch]==tran)
trs[nde][ch]=rnde,nde=fth[nde];
}
}
}
void DFS(int nde)
{
for(int i=p[nde];i;i=noww[i])
DFS(goal[i]),siz[nde]+=siz[goal[i]];
}
int main()
{
register int i;
scanf("%d%d",<h,&kth),lst=tot=;
for(i=;i<=lth;i++) scanf("%d",&rd),Insert(rd);
for(i=;i<=tot;i++) Link(fth[i],i); DFS();
for(i=;i<=tot;i++)
if(siz[i]>=kth) ans=max(ans,len[i]);
printf("%d",ans);
return ;
}
解题:USACO06DEC Milk Patterns的更多相关文章
- USACO06DEC Milk Patterns——Solution
题目描述 Farmer John has noticed that the quality of milk given by his cows varies from day to day. On f ...
- [USACO06DEC] Milk Patterns
题目描述 Farmer John has noticed that the quality of milk given by his cows varies from day to day. On f ...
- BZOJ 1717 [USACO06DEC] Milk Patterns (后缀数组+二分)
题目大意:求可重叠的相同子串数量至少是K的子串最长长度 洛谷传送门 依然是后缀数组+二分,先用后缀数组处理出height 每次二分出一个长度x,然后去验证,在排序的后缀串集合里,有没有连续数量多于K个 ...
- luoguP2852 [USACO06DEC]Milk Patterns
题意 显然如果有一个子串出现过\(k\)次,那么它必定是一个至少长为k的后缀序的\(LCP\),求出所有相邻的长为\(k-1\)的\(height\)数组的最小值,在其中取最大值即可 code: #i ...
- [洛谷P2852] [USACO06DEC]牛奶模式Milk Patterns
洛谷题目链接:[USACO06DEC]牛奶模式Milk Patterns 题目描述 Farmer John has noticed that the quality of milk given by ...
- POJ 3261 Milk Patterns 【后缀数组 最长可重叠子串】
题目题目:http://poj.org/problem?id=3261 Milk Patterns Time Limit: 5000MS Memory Limit: 65536K Total Subm ...
- BZOJ 1717: [Usaco2006 Dec]Milk Patterns 产奶的模式 [后缀数组]
1717: [Usaco2006 Dec]Milk Patterns 产奶的模式 Time Limit: 5 Sec Memory Limit: 64 MBSubmit: 1017 Solved: ...
- POJ 3261 Milk Patterns 后缀数组求 一个串种 最长可重复子串重复至少k次
Milk Patterns Description Farmer John has noticed that the quality of milk given by his cows varie ...
- 【BZOJ-1717】Milk Patterns产奶的模式 后缀数组
1717: [Usaco2006 Dec]Milk Patterns 产奶的模式 Time Limit: 5 Sec Memory Limit: 64 MBSubmit: 881 Solved: ...
随机推荐
- 性能测试工具——LoadRunner篇(一)
一.LoadRunner组件 1.Virtual User Generato——r录制最终用户业务流程并创建性能 2.Controller——组织.驱动.管理并发监控负载测试 3.Analysis—— ...
- JavaScript 中函数的定义和调用
3种函数定义方式: 1.使用关键字 function 来声明并定义函数 function myFunction(a, b) { return a * b; } 调用函数: var x = myFunc ...
- 【洛谷】题解 P1056 【排座椅】
题目链接 因为题目说输入保证会交头接耳的同学前后相邻或者左右相邻,所以一对同学要分开有且只有一条唯一的通道才能把他们分开. 于是可以吧这条通道累加到一个数组里面.应为题目要求纵列的通道和横列的通道条数 ...
- python-将爬取到的m3u8合并为mp4
当你看到这个博客的时候恭喜你,你以后不用开vip就可以观看和下载vip视频了 最简单的观看vip视频步骤:进入全民解析网将vip视频地址进行解析 以下代码是通过python将vip视频进行下载为mp4 ...
- python终端计算器,还有没其他方法?
import sysdef lt(a, b, c ): if b == "+": return int(a)+int(c) elif b == "-": ret ...
- sql批量更新
-----------------更新无锡医院名称 update Opt_DKI_Hospital set centerName =tmp.[医院名称] from Opt_DKI_Hospital h ...
- Windows下使用WinRAR命令自动备份文件
最近有一个需求:为了防止数据丢失,每天对固定文件夹下的文件进行打包压缩备份. 解决办法:使用Windows的任务计划程序,每天执行一下压缩命令: Windows任务计划程序在这里就不再介绍了,网上有很 ...
- 1.openldap介绍
1.openldap介绍 OpenLDAP是轻型目录访问协议(Lightweight Directory Access Protocol,LDAP)的自由和开源的实现,在其OpenLDAP许可证下发行 ...
- 互评Alpha版本——二次元梦之队——“I Do”
基于NABCD评论作品,及改进建议 1.根据(不限于)NABCD评论作品的选题 (1)N(Need,需求) 随着智能科技的发展和普及,编程教育的重要性已经逐渐凸显出来.美国前总统奥巴马曾说“编程应当与 ...
- MYSQL报警:Warning: Using a password on the command line interface can be insecure.
问题描述:执行下面的语句,sql是执行成功了,但是出现了一个报警,报警看上去始终不舒服 mysql -hip -Pport -uuser -ppassword -e "use db;dele ...