当前位置: 首页 > 编程日记 > 正文

HDU4080 Stammering Aliens(二分 + 后缀数组)

题目

Source

http://acm.hdu.edu.cn/showproblem.php?pid=4080

Description

Dr. Ellie Arroway has established contact with an extraterrestrial civilization. However, all efforts to decode their messages have failed so far because, as luck would have it, they have stumbled upon a race of stuttering aliens! Her team has found out that, in every long enough message, the most important words appear repeated a certain number of times as a sequence of consecutive characters, even in the middle of other words. Furthermore, sometimes they use contractions in an obscure manner. For example, if they need to say bab twice, they might just send the message babab, which has been abbreviated because the second b of the first word can be reused as the first b of the second one.
Thus, the message contains possibly overlapping repetitions of the same words over and over again. As a result, Ellie turns to you, S.R. Hadden, for help in identifying the gist of the message.
Given an integer m, and a string s, representing the message, your task is to find the longest substring of s that appears at least m times. For example, in the message baaaababababbababbab, the length-5 word babab is contained 3 times, namely at positions 5, 7 and 12 (where indices start at zero). No substring appearing 3 or more times is longer (see the first example from the sample input). On the other hand, no substring appears 11 times or more (see example 2). In case there are several solutions, the substring with the rightmost occurrence is preferred (see example 3).

Input

The input contains several test cases. Each test case consists of a line with an integer m (m >= 1), the minimum number of repetitions, followed by a line containing a string s of length between m and 40 000, inclusive. All characters in s are lowercase characters from "a" to "z". The last test case is denoted by m = 0 and must not be processed.

Output

Print one line of output for each test case. If there is no solution, output none; otherwise, print two integers in a line, separated by a space. The first integer denotes the maximum length of a substring appearing at least m times; the second integer gives the rightmost starting position of this substring.

Sample Input

3
baaaababababbababbab
11
baaaababababbababbab
3
cccccc
0

Sample Output

5 12
none
4 2

分析

题目大概说给一个字符串,求出现至少m的子串的最长长度以及出现在最右边的位置。

经典的后缀数组题目吧,二分长度,height分组判定长度是否成立。。

代码

#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
#define MAXN 44444int wa[MAXN],wb[MAXN],wv[MAXN],ws[MAXN];
int cmp(int *r,int a,int b,int l){return r[a]==r[b] && r[a+l]==r[b+l];
}
int sa[MAXN],rnk[MAXN],height[MAXN];
void SA(int *r,int n,int m){int *x=wa,*y=wb;for(int i=0; i<m; ++i) ws[i]=0;for(int i=0; i<n; ++i) ++ws[x[i]=r[i]];for(int i=1; i<m; ++i) ws[i]+=ws[i-1];for(int i=n-1; i>=0; --i) sa[--ws[x[i]]]=i;int p=1;for(int j=1; p<n; j<<=1,m=p){p=0;for(int i=n-j; i<n; ++i) y[p++]=i;for(int i=0; i<n; ++i) if(sa[i]>=j) y[p++]=sa[i]-j;for(int i=0; i<n; ++i) wv[i]=x[y[i]];for(int i=0; i<m; ++i) ws[i]=0;for(int i=0; i<n; ++i) ++ws[wv[i]];for(int i=1; i<m; ++i) ws[i]+=ws[i-1];for(int i=n-1; i>=0; --i) sa[--ws[wv[i]]]=y[i];swap(x,y); x[sa[0]]=0; p=1;for(int i=1; i<n; ++i) x[sa[i]]=cmp(y,sa[i-1],sa[i],j)?p-1:p++;}for(int i=1; i<n; ++i) rnk[sa[i]]=i;int k=0;for(int i=0; i<n-1; height[rnk[i++]]=k){if(k) --k;for(int j=sa[rnk[i]-1]; r[i+k]==r[j+k]; ++k);}
}char str[MAXN];
int n,m,a[MAXN];bool isOK(int len){int left=-1,right,mx=0;for(int i=2; i<=n; ++i){if(height[i]>=len){if(left==-1) left=i-1;right=i;}else{left=-1;}if(left!=-1) mx=max(mx,right-left+1);}return mx>=m;
}int getRightMost(int len){int left=-1,right,mx=0,tmp=0;for(int i=2; i<=n; ++i){if(height[i]>=len){if(left==-1) left=i-1;right=i;tmp=max(tmp,max(sa[i-1],sa[i]));}else{left=-1;tmp=0;}if(left!=-1){if(right-left+1>=m) mx=max(mx,tmp);}}return mx;
}int main(){while(scanf("%d",&m)==1 && m){scanf("%s",str);n=strlen(str);if(m==1){printf("%d %d\n",n,0);continue;}for(int i=0; i<n; ++i){a[i]=str[i]-'a'+1;}a[n]=0;SA(a,n+1,28);int l=0,r=MAXN;while(l<r){int mid=l+r+1>>1;if(isOK(mid)) l=mid;else r=mid-1;}if(l==0){puts("none");continue;}printf("%d %d\n",l,getRightMost(l));}return 0;
}

转载于:https://www.cnblogs.com/WABoss/p/5830269.html

相关文章:

共识机制:区块链技术的根基

链客&#xff0c;专为开发者而生&#xff0c;有问必答&#xff01; 此文章来自区块链技术社区&#xff0c;未经允许拒绝转载。 Chapter&#xff0d;1&#xff1a;什么是共识机制&#xff1f; 技术定义是&#xff1a;共识机制是一个群体决策的流程&#xff0c;群体中的个体会执…

Web App、Hybrid App与Native App的设计差异

目前主流应用程序大体分为三类&#xff1a;Web App、Hybrid App、 Native App。 一、Web App、Hybrid App、Native App 纵向对比 首先&#xff0c;我们来看看什么是 Web App、Hybrid App、 Native App。 1. Web APP Web App 指采用Html5语言写出的App&#xff0c;不需要下载安装…

输入重定向,输出重定向,管道相关内容及实现方法

近期&#xff0c;通过实现shell了解了输入重定向&#xff0c;输出重定向&#xff0c;管道- 用自己的话总结定义&#xff1a; 输入重定向&#xff1a;把<右边的文件的内容输入到<左边的命令中。 输出重定向&#xff1a;把运行>左边命令得出的结果输入到>右边的文件中…

appium+python自动化测试教程_Python+Appium实现自动化测试

一、环境准备 1.脚本语言&#xff1a;Python3.x IDE&#xff1a;安装Pycharm 2.安装Java JDK 、Android SDK 3.adb环境&#xff0c;path添加E:\Software\Android_SDK\platform-tools 4.安装Appium for windows&#xff0c;官网地址 http://appium.io/点击下载按钮会到GitHub的下…

区块链热度飙升 BAT抢先布局话语权争夺战开打

链客&#xff0c;专为开发者而生&#xff0c;有问必答&#xff01; 此文章来自区块链技术社区&#xff0c;未经允许拒绝转载。 今年以来&#xff0c;在互联网金融相对沉寂之后&#xff0c;区块链已当仁不让成为科技领域的主角。区块链作为一项突破性的新技术&#xff0c;如同当…

【CV知识学习】early stop、regularation、fine-tuning and some other trick to be known

深度学习有不少的trick&#xff0c;而且这些trick有时还挺管用的&#xff0c;所以&#xff0c;了解一些trick还是必要的。上篇说的normalization、initialization就是trick的一种&#xff0c;下面再总结一下自己看Deep Learning Summer School, Montreal 2016 总结的一些trick。…

etw系统provider事件较多_【Flutter 实战】文件系统目录

老孟导读&#xff1a;Flutter 中获取文件路径&#xff0c;我们都知道使用 path_provider&#xff0c;但对其目录对含义不是很清楚&#xff0c;此文介绍 Android、iOS 系统的文件目录&#xff0c;不同场景下建议使用的目录。 不同的平台对应的文件系统是不同的&#xff0c;比如文…

BZOJ4491: 我也不知道题目名字是什么

【传送门&#xff1a;BZOJ4491】 简要题意&#xff1a; 给出一个长度为n的序列&#xff0c;m个操作&#xff0c;每个操作输入x&#xff0c;y&#xff0c;求出第x个数到第y个数的最长子串&#xff0c;保证这个最长子串是不上升或不下降子串 题解&#xff1a; 线段树 因为不上升或…

区块链挖矿的钱从哪来 区块链挖矿怎么挣钱

链客&#xff0c;专为开发者而生&#xff0c;有问必答&#xff01; 此文章来自区块链技术社区&#xff0c;未经允许拒绝转载。 进入2018年以来&#xff0c;区块链在资本市场的风口上依然热度不减&#xff0c;已成为当下最热的投资领域。而普通投资者想通过区块链投资赚钱最简单…

Linux-TCP/IP TIME_WAIT状态原理

TIME_WAIT状态原理----------------------------通信双方建立TCP连接后&#xff0c;主动关闭连接的一方就会进入TIME_WAIT状态。客户端主动关闭连接时&#xff0c;会发送最后一个ack后&#xff0c;然后会进入TIME_WAIT状态&#xff0c;再停留2个MSL时间(后有MSL的解释)&#xf…

python如何实现找图_利用OpenCV和Python实现查找图片差异

使用OpenCV和Python查找图片差异 flyfish 方法1 均方误差的算法&#xff08;Mean Squared Error , MSE&#xff09;下面的一些表达与《TensorFlow - 协方差矩阵》式子表达式一样的拟合 误差平方和&#xff08; sum of squared errors&#xff09; residual sum of squares (RSS…

区块链还能赚钱吗 区块链挖矿赚钱吗

链客&#xff0c;专为开发者而生&#xff0c;有问必答&#xff01; 此文章来自区块链技术社区&#xff0c;未经允许拒绝转载。 区块链有多火&#xff0c;连我母上都知道这个词&#xff0c;身边很多人也都向笔者咨询这个东西。 其实他们真实的想法是&#xff0c;想知道这东西到…

pythonfor循环遍历list_为什么for循环可以遍历list:Python中迭代器与生成器

1 引言 只要你学了Python语言&#xff0c;就不会不知道for循环&#xff0c;也肯定用for循环来遍历一个列表&#xff08;list)&#xff0c;那为什么for循环可以遍历list&#xff0c;而不能遍历int类型对象呢&#xff1f;怎么让一个自定义的对象可遍历&#xff1f; 这篇博客中&am…

Linux下查看和添加环境变量

转自&#xff1a;http://blog.sina.com.cn/s/blog_688077cf01013qrk.html $PATH&#xff1a;决定了shell将到哪些目录中寻找命令或程序&#xff0c;PATH的值是一系列目录&#xff0c;当您运行一个程序时&#xff0c;Linux在这些目录下进行搜寻编译链接。 编辑你的 PATH 声明&am…

iis7下站点日志默认位置

iis7下站点日志默认位置 原文:iis7下站点日志默认位置iis7下站点日志默认位置在iis6时&#xff0c;通过iis管理器的日志配置可以找到站点日志存储的位置。但是在iis7下&#xff0c;iis管理器下的日志配置只能找到iis日志配置的主目录&#xff0c;但到底在哪个子目录&#xff0c…

go语言有哪些优势

链客&#xff0c;专为开发者而生&#xff0c;有问必答&#xff01; 此文章来自区块链技术社区&#xff0c;未经允许拒绝转载。 1、学习曲线容易 Go语言语法简单&#xff0c;包含了类C语法。因为Go语言容易学习&#xff0c;所以一个普通的大学生花几个星期就能写出来可以上手的…

重定向后,如何通过浏览器返回定向之前的页面?

js实现页面跳转重定向的几种方式 第一种&#xff1a; 代码如下: <script language"javascript"type"text/javascript">window.location.href"http://shanghepinpai.com";</script> 第二种&#xff1a; 代码如下: <script languag…

金蝶中间件部署报栈溢出_京东618压测时自研中间件暴露出的问题,压测级别数十万/秒...

618大促演练进行了全链路压测&#xff0c;在此之前刚好我的热key探测框架也已经上线灰度一周了&#xff0c;小范围上线了几千台服务器&#xff0c;每秒大概接收几千个key探测&#xff0c;每天大概几亿左右&#xff0c;因为量很小&#xff0c;所以框架表现稳定。借着这次压测&am…

利用box-shadow绘图

上篇博客提到过&#xff0c;box-shadow属性的本质是对形状的复制&#xff0c;那么如果我设置一个1*1px的i标签&#xff0c;利用box-shadow可以叠加的特性&#xff0c;给每一个1*1px的阴影赋上颜色&#xff0c;那么最后不就是一幅图片了么。 html代码很简单&#xff1a; <!do…

为什么要使用Go语言?Go语言的优势在哪里?

链客&#xff0c;专为开发者而生&#xff0c;有问必答&#xff01; 此文章来自区块链技术社区&#xff0c;未经允许拒绝转载。 Go语言之所有越来越受到开发者的欢迎&#xff0c;我认为与其超高的实用价值密不可分。要知道Go语言是为了解决现实问题而设计的&#xff0c;而不是为…

BI之SSAS完整实战教程3 -- 创建第一个多维数据集

上一篇我们已经完成了数据源的准备工作&#xff0c;现在我们就开始动手&#xff0c;创建第一个多维数据集(Cube)。 文章提纲 使用多维数据集向导创建多维数据集 总结Cube设计器简介 维度细化 总结 一、使用向导创建多维数据集 在Analysis Services中&#xff0c;可以通过3种…

python opencv local_threshold_Python-OpenCV中的cv2.threshold

主要记录Python-OpenCV中的cv2,threshold()方法&#xff1b;官方文档 cv2.threshold() def threshold(src, thresh, maxval, type, dstNone): """ 设置固定级别的阈值应用于多通道矩阵 例如&#xff0c;将灰度图像变换二值图像&#xff0c;或去除指定级别的噪声…

java中decimalFormat格式化数值

介绍 我们经常要对数字进行格式化&#xff0c;比如取小数点后两位小数&#xff0c;或者加个百分比符号等&#xff0c;Java提供了DecimalFormat这个类0 和 # 的区别 "#"可以理解为在正常的数字显示中&#xff0c;如果前缀与后缀出现不必要的多余的0&#xff0c;则将其…

GO语言有哪些优势?怎样入门?

链客&#xff0c;专为开发者而生&#xff0c;有问必答&#xff01; 此文章来自区块链技术社区&#xff0c;未经允许拒绝转载。 1、学习曲线 它包含了类C语法、GC内置和工程工具。这一点非常重要&#xff0c;因为Go语言容易学习&#xff0c;所以一个普通的大学生花一个星期就能…

POJ-2955 Brackets

题目大意&#xff1a; 给你一个只由(、)、[、]组成的字符串&#xff0c;问你这个字符串的子串能够匹配的最长长度是多少。 能够匹配的意思是这样的&#xff1a; 1.如果s是个空串&#xff0c;那么它是匹配的。 2.如果子串是(s)或者[s]&#xff0c;那么它也是匹配的&#xff0c;其…

CentOS7.4-btrfs管理及使用

btrfs, B-tree File System, GPL开源文件系统, 支持CoW即读时写入. 核心特性: 多物理卷支持;btrfs可由多个底层磁盘组成支持RAID mkfs.btrfs 命令的man文档支持: raid0, raid1, raid5, raid6,raid10, single or dup联机"添加, 移除, 修改" CoW写时复制更新机制 对文件…

取消对 null 指针“l”的引用。_C++中的引用

当变量声明为引用时&#xff0c;它将成为现有变量的替代名称。通过在声明中添加“&#xff06;”&#xff0c;可以将变量声明为引用。#include using namespace std; int main() { int x 10; // ref is a reference to x. int& ref x; // Value of x is no…

你没听说过的Go语言惊人优点

链客&#xff0c;专为开发者而生&#xff0c;有问必答&#xff01; 此文章来自区块链技术社区&#xff0c;未经允许拒绝转载。 在这篇文章中&#xff0c;我将讨论为什么你需要尝试一下 Go 语言&#xff0c;以及应该从哪里学起。 Go 语言是可能是最近几年里你经常听人说起的编…

JS document

<!DOCTYPE html> <html><head><meta charset"UTF-8"><title></title></head><body><div id"one">今天下雨</div><table border"1" cellspacing"0" cellpadding"…

python 流写入文件_python文件流操作

博主在学习python时对文件进行操作时经常踩一下坑。所以专门梳理了一下。有问题麻烦指出哈。 python对于文件的操作我们一般是用open&#xff08;&#xff09;。我们根据python的源码可以看出。我们必须要传的参是file即打开文件的URL。同时open方法默认是是r的打开方式即只读。…