这题说的是给了一串字符 我们要将这个字符 中找出至少出现m次的最长字符串 一个字符课多次使用

利用后缀数组计算最长的lcp

这里有一个点 记得将后缀数组中加入一个空串 如果遇到全部相同的字符时 没办法 判断 倒数第二个和 第三个的大小 因此他们就会被遗漏

#include <iostream>
#include <algorithm>
#include <cstdio>
#include <vector>
#include <string.h>
using namespace std;
const int maxn =;
struct SuffixArray
{
int s[maxn];
int sa[maxn];
int t[maxn],t2[maxn],c[maxn];
int rank[maxn],lcp[maxn];
int n;
void build(int m)
{ int *x=t,*y=t2,i;
for(i=; i<m; i++ )c[i]=;
for(i=; i<n; i++)c[ x[i]=s[i] ]++;
for(i=; i<m; i++)c[i]+=c[i-];
for(i=n-; i>=; i--)sa[ --c[ x[i] ] ]=i;
for(int k=; k<=n; k<<=)
{
int p=;
for(i=n-k; i<n; i++) y[ p++ ]=i;
for(i=; i<n; i++)if(sa[i]>=k) y[p++ ]= sa[i]-k;
for(i=; i<m; i++) c[ i ]=;
for(i=; i<n; i++) c[ x[ y[i] ] ]++;
for(i=; i<m; i++)c[i]+=c[i-];
for(i=n-; i>=; i--)
sa[ -- c[ x[ y[ i ] ] ] ]=y[i];
for(i=; i<n; i++)rank[ sa[i] ]=i;
p=;
swap(x,y);
x[ sa[] ] =;
for(int i=; i<n; i++)
x[ sa[i] ]= y[ sa[i] ]==y[ sa[i-] ]&&y[ sa[i]+k ]==y[ sa[i-]+k ] ?p-:p++;
if(p>=n)break;
m=p;
}
}
void getLcp()
{
int i,k=;
for(i=; i<n; i++)rank[ sa[ i ] ] =i;
for(i=; i<n; i++)
{
if(k)k--;
int j=sa[ rank[i]- ];
while(s[j+k]==s[i+k])k++;
lcp[ rank[i] ]=k;
}
}
}sa;
bool solve(int len,int m)
{
int L=;
for(int R=; R<=sa.n; R++)
{
if(sa.lcp[R]<len||R==sa.n)
{
if( R-L >= m )return true;
L=R;
} }
return false;
}
int look(int L, int R)
{
int ans=-;
for(int i=L; i<R; i++)
{
ans=max(sa.sa[i],ans);
}
return ans;
} int select(int len, int m)
{
int L=,ad=-; for(int R=; R<=sa.n; R++)
{
if(sa.lcp[R]<len||R==sa.n)
{
if(R-L>=m)
{
ad=max(look(L,R),ad);
} L=R;
} }
return ad;
}
char ss[maxn];
int main()
{
int m;
while(scanf("%d",&m)==)
{ if(m==)break;
scanf("%s",ss); sa.n=strlen(ss);
for(int i=; i<sa.n; i++)
{
sa.s[i]= ss[i]-'a'+;
}
if(m==)
{
printf("%d %d\n",sa.n,); continue;
}
sa.s[sa.n]=;
sa.n++;
sa.build();
sa.getLcp(); if(solve(,m)==false)
{
puts("none");continue;
}
int L=,R=sa.n,ans;
while(L<=R)
{
int mid=(R+L)/;
if(solve(mid,m)){
ans=mid; L=mid+;
}else R=mid-;
}
printf("%d %d\n",ans,select(ans,m));
}
return ;
}

uva12206 后缀数组的更多相关文章

  1. Uva12206 Stammering Aliens 后缀数组&&Hash

    Dr. Ellie Arroway has established contact with an extraterrestrial civilization. However, all effort ...

  2. 后缀数组的倍增算法(Prefix Doubling)

    后缀数组的倍增算法(Prefix Doubling) 文本内容除特殊注明外,均在知识共享署名-非商业性使用-相同方式共享 3.0协议下提供,附加条款亦可能应用. 最近在自学习BWT算法(Burrows ...

  3. BZOJ 4199: [Noi2015]品酒大会 [后缀数组 带权并查集]

    4199: [Noi2015]品酒大会 UOJ:http://uoj.ac/problem/131 一年一度的“幻影阁夏日品酒大会”隆重开幕了.大会包含品尝和趣味挑战两个环节,分别向优胜者颁发“首席品 ...

  4. BZOJ 1692: [Usaco2007 Dec]队列变换 [后缀数组 贪心]

    1692: [Usaco2007 Dec]队列变换 Time Limit: 5 Sec  Memory Limit: 64 MBSubmit: 1383  Solved: 582[Submit][St ...

  5. POJ3693 Maximum repetition substring [后缀数组 ST表]

    Maximum repetition substring Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 9458   Acc ...

  6. POJ1743 Musical Theme [后缀数组]

    Musical Theme Time Limit: 1000MS   Memory Limit: 30000K Total Submissions: 27539   Accepted: 9290 De ...

  7. 后缀数组(suffix array)详解

    写在前面 在字符串处理当中,后缀树和后缀数组都是非常有力的工具. 其中后缀树大家了解得比较多,关于后缀数组则很少见于国内的资料. 其实后缀数组是后缀树的一个非常精巧的替代品,它比后缀树容易编程实现, ...

  8. 【UOJ #35】后缀排序 后缀数组模板

    http://uoj.ac/problem/35 以前做后缀数组的题直接粘模板...现在重新写一下模板 注意用来基数排序的数组一定要开到N. #include<cstdio> #inclu ...

  9. 【BZOJ-2119】股市的预测 后缀数组

    2119: 股市的预测 Time Limit: 10 Sec  Memory Limit: 259 MBSubmit: 334  Solved: 154[Submit][Status][Discuss ...

随机推荐

  1. Xcode - Debug汇编模式切换调试

    一.概念 1.汇编指令: 模拟器上运行的是Intel指令,而真机上运行的是arm指令, 2.每条汇编指令的格式总是由: 操作码, 操作数1,操作数2,操作数3组成. 操作数要么就是常数,要么就是寄存储 ...

  2. 地址转换函数:inet_aton & inet_ntoa & inet_addr和inet_pton & inet_ntop

    在Unix网络编程中,我们常用到地址转换函数,它将ASCII字符串(如"206.62.226.33")与网络字节序的二进制值(这个值保存在套接口地址结构中)间进行地址的转换. 1. ...

  3. php无限极分类递归与普通

    1. 递归 public function getInfo(){$data=$this->select();$arr=$this->noLimit($data,$f_id=0,$level ...

  4. CNN中的池化层的理解和实例

    池化操作是利用一个矩阵窗口在输入张量上进行扫描,并且每个窗口中的值通过取最大.取平均或其它的一些操作来减少元素个数.池化窗口由ksize来指定,根据strides的长度来决定移动步长.如果stride ...

  5. Python爬虫实例(六)多进程下载金庸网小说

    目标任务:使用多进程下载金庸网各个版本(旧版.修订版.新修版)的小说 代码如下: # -*- coding: utf-8 -*- import requests from lxml import et ...

  6. 基于bind搭建DNS主从

    使用bind的主从复制功能可以实现的功能:提供冗余,避免单点故障:均衡负载查询需求,从而提高系统可用性. 一.安装 #bind-chroot 负责DNS安全作用,将bind进程严格限制在特定的目录中 ...

  7. Qt With Web(两种方法: WebAssembly,WebGL)

    Qt 写的程序,可以通过某些方式,在 web 上浏览 https://www.youtube.com/watch?v=OJ1ieyuIQzE​www.youtube.comhttps://www.yo ...

  8. Java中的反射机制(一)

    基本概念 在Java运行时环境中,对于任意一个类,能否知道这个类有哪些属性和方法?对于任意一个对象,能否调用它的任意一个方法? 答案是肯定的. 这种动态获取类的信息以及动态调用对象的方法的功能来自于J ...

  9. CSS3实现背景透明,文字不透明

    最近遇到一个需求,要在图片上显示带有半透明背景的文字,效果如下图所示: 看到这个需求之后,第一反应是使用CSS3中的opacity设置元素的透明度. <!DOCTYPE html> < ...

  10. dedecms用keyword标签调用含有某一关键词的文章

    前面我们探讨了调用{dede:likewords}为dedecms添加相关搜索词,如果要调用含有某一关键词的文章可以实现吗?比如ytkah的网站有很多文章中含有“微信”的词,那么想在网站首页.频道页. ...