【BZOJ1717】[Usaco2006 Dec]Milk Patterns 产奶的模式 (二分+SA)

求重复k次的最长重复子串,解法见罗穗骞大神的后缀数组论文

  1 const maxn=100419;
  2  
  3 var
  4  x,y,rank,sa,h,s,num,c:array[0..maxn] of longint;
  5  n,time:longint;
  6  
  7 function max(x,y:longint):longint; begin if x>y then exit(x) else exit(y); end;
  8 function min(x,y:longint):longint; begin if x<y then exit(x) else exit(y); end;
  9 procedure make;
 10 var i,j,p,tot:longint;
 11 begin
 12  p:=1;
 13  while p<n do
 14   begin
 15    fillchar(c,sizeof(c),0);
 16    for i:= 1 to n-p do y[i]:=rank[i+p];
 17    for i:= n-p+1 to n do y[i]:=0;
 18    for i:= 1 to n do inc(c[y[i]]);
 19    for i:= 1 to n do inc(c[i],c[i-1]);
 20    for i:= 1 to n do
 21     begin
 22      sa[c[y[i]]]:=i;
 23      dec(c[y[i]]);
 24     end;
 25    fillchar(c,sizeof(c),0);
 26    for i:= 1 to n do x[i]:=rank[i];
 27    for i:= 1 to n do inc(c[x[i]]);
 28    for i:= 1 to n do inc(c[i],c[i-1]);
 29    for i:= n downto 1 do
 30     begin
 31      y[sa[i]]:=c[x[sa[i]]];
 32      dec(c[x[sa[i]]]);
 33     end;
 34    for i:= 1 to n do sa[y[i]]:=i;
 35    tot:=1;
 36    rank[sa[1]]:=1;
 37    for i:= 2 to n do
 38     begin
 39      if (x[sa[i]]<>x[sa[i-1]]) or (x[sa[i]+p]<>x[sa[i-1]+p]) then inc(tot);
 40      rank[sa[i]]:=tot;
 41     end;
 42    p:=p<<1;
 43   end;
 44 end;
 45  
 46 procedure makeht;
 47 var i,j,p:longint;
 48 begin
 49  h[1]:=0; p:=0;
 50  for i:= 1 to n do
 51   begin
 52    p:=max(p-1,0);
 53    if rank[i]=1 then continue;
 54    j:=sa[rank[i]-1];
 55    while (i+p<=n) and (j+p<=n) and (s[i+p]=s[j+p]) do inc(p);
 56    h[rank[i]]:=p;
 57   end;
 58 end;
 59  
 60 procedure init;
 61 var i,j,tot:longint;
 62  ch:char;
 63 begin
 64  readln(n,time);
 65  for i:= 1 to n do readln(s[i]);
 66  for i:= 1 to n do x[i]:=s[i];
 67  fillchar(c,sizeof(c),0);
 68  for i:= 1 to n do inc(c[x[i]]);
 69  for i:= 1 to 180 do inc(c[i],c[i-1]);
 70  for i:= 1 to n do
 71   begin
 72    sa[c[x[i]]]:=i;
 73    dec(c[x[i]]);
 74   end;
 75  rank[sa[1]]:=1;
 76  tot:=1;
 77  for i:= 2 to n do
 78   begin
 79    if x[sa[i]]<>x[sa[i-1]] then inc(tot);
 80    rank[sa[i]]:=tot;
 81   end;
 82  make;
 83  makeht;
 84 end;
 85  
 86 function check(k:longint):boolean;
 87 var i,j,x,y:longint;
 88 begin
 89  i:=1;
 90  while i<=n do
 91   begin
 92    j:=i;
 93    while (j<n) and (h[j+1]>=k) do inc(j);
 94    if j-i+1>=time then exit(true);
 95    i:=j+1;
 96   end;
 97  exit(false);
 98 end;
 99  
100 procedure solve;
101 var l,r,mid,ans:longint;
102 begin
103  l:=0; r:=n>>1; ans:=0;
104  while l<=r do
105   begin
106    mid:=(l+r)>>1;
107    if check(mid) then
108     begin
109      l:=mid+1;
110      ans:=mid;
111     end
112    else r:=mid-1;
113   end;
114  writeln(ans);
115 end;
116  
117 Begin
118  init;
119  solve;
120 End.
View Code

 

转载于:https://www.cnblogs.com/EC-Ecstasy/p/4167967.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Go语言(也称为Golang)是由Google开发的一种静态强类型、编译型的编程语言。它旨在成为一门简单、高效、安全和并发的编程语言,特别适用于构建高性能的服务器和分布式系统。以下是Go语言的一些主要特点和优势: 简洁性:Go语言的语法简单直观,易于学习和使用。它避免了复杂的语法特性,如继承、重载等,转而采用组合和接口来实现代码的复用和扩展。 高性能:Go语言具有出色的性能,可以媲美C和C++。它使用静态类型系统和编译型语言的优势,能够生成高效的机器码。 并发性:Go语言内置了对并发的支持,通过轻量级的goroutine和channel机制,可以轻松实现并发编程。这使得Go语言在构建高性能的服务器和分布式系统时具有天然的优势。 安全性:Go语言具有强大的类型系统和内存管理机制,能够减少运行时错误和内存泄漏等问题。它还支持编译时检查,可以在编译阶段就发现潜在的问题。 标准库:Go语言的标准库非常丰富,包含了大量的实用功能和工具,如网络编程、文件操作、加密解密等。这使得开发者可以更加专注于业务逻辑的实现,而无需花费太多时间在底层功能的实现上。 跨平台:Go语言支持多种操作系统和平台,包括Windows、Linux、macOS等。它使用统一的构建系统(如Go Modules),可以轻松地跨平台编译和运行代码。 开源和社区支持:Go语言是开源的,具有庞大的社区支持和丰富的资源。开发者可以通过社区获取帮助、分享经验和学习资料。 总之,Go语言是一种简单、高效、安全、并发的编程语言,特别适用于构建高性能的服务器和分布式系统。如果你正在寻找一种易于学习和使用的编程语言,并且需要处理大量的并发请求和数据,那么Go语言可能是一个不错的选择。
Go语言(也称为Golang)是由Google开发的一种静态强类型、编译型的编程语言。它旨在成为一门简单、高效、安全和并发的编程语言,特别适用于构建高性能的服务器和分布式系统。以下是Go语言的一些主要特点和优势: 简洁性:Go语言的语法简单直观,易于学习和使用。它避免了复杂的语法特性,如继承、重载等,转而采用组合和接口来实现代码的复用和扩展。 高性能:Go语言具有出色的性能,可以媲美C和C++。它使用静态类型系统和编译型语言的优势,能够生成高效的机器码。 并发性:Go语言内置了对并发的支持,通过轻量级的goroutine和channel机制,可以轻松实现并发编程。这使得Go语言在构建高性能的服务器和分布式系统时具有天然的优势。 安全性:Go语言具有强大的类型系统和内存管理机制,能够减少运行时错误和内存泄漏等问题。它还支持编译时检查,可以在编译阶段就发现潜在的问题。 标准库:Go语言的标准库非常丰富,包含了大量的实用功能和工具,如网络编程、文件操作、加密解密等。这使得开发者可以更加专注于业务逻辑的实现,而无需花费太多时间在底层功能的实现上。 跨平台:Go语言支持多种操作系统和平台,包括Windows、Linux、macOS等。它使用统一的构建系统(如Go Modules),可以轻松地跨平台编译和运行代码。 开源和社区支持:Go语言是开源的,具有庞大的社区支持和丰富的资源。开发者可以通过社区获取帮助、分享经验和学习资料。 总之,Go语言是一种简单、高效、安全、并发的编程语言,特别适用于构建高性能的服务器和分布式系统。如果你正在寻找一种易于学习和使用的编程语言,并且需要处理大量的并发请求和数据,那么Go语言可能是一个不错的选择。
Go语言(也称为Golang)是由Google开发的一种静态强类型、编译型的编程语言。它旨在成为一门简单、高效、安全和并发的编程语言,特别适用于构建高性能的服务器和分布式系统。以下是Go语言的一些主要特点和优势: 简洁性:Go语言的语法简单直观,易于学习和使用。它避免了复杂的语法特性,如继承、重载等,转而采用组合和接口来实现代码的复用和扩展。 高性能:Go语言具有出色的性能,可以媲美C和C++。它使用静态类型系统和编译型语言的优势,能够生成高效的机器码。 并发性:Go语言内置了对并发的支持,通过轻量级的goroutine和channel机制,可以轻松实现并发编程。这使得Go语言在构建高性能的服务器和分布式系统时具有天然的优势。 安全性:Go语言具有强大的类型系统和内存管理机制,能够减少运行时错误和内存泄漏等问题。它还支持编译时检查,可以在编译阶段就发现潜在的问题。 标准库:Go语言的标准库非常丰富,包含了大量的实用功能和工具,如网络编程、文件操作、加密解密等。这使得开发者可以更加专注于业务逻辑的实现,而无需花费太多时间在底层功能的实现上。 跨平台:Go语言支持多种操作系统和平台,包括Windows、Linux、macOS等。它使用统一的构建系统(如Go Modules),可以轻松地跨平台编译和运行代码。 开源和社区支持:Go语言是开源的,具有庞大的社区支持和丰富的资源。开发者可以通过社区获取帮助、分享经验和学习资料。 总之,Go语言是一种简单、高效、安全、并发的编程语言,特别适用于构建高性能的服务器和分布式系统。如果你正在寻找一种易于学习和使用的编程语言,并且需要处理大量的并发请求和数据,那么Go语言可能是一个不错的选择。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值