题解 UVA12206 【Stammering Aliens】
终于A了这道题啊(坑啊)
教练说:这道题不能用map吧,复杂度不一个O(nlogn)吗
于是我就一直想不出来,然后看题解代码,一看就是map...
所以我就在想,那复杂度是不是也不是O(nlogn)呢
教练看了半天,说:好像确实不是诶
原来阻挡我的最大障碍是教练啊!!!(当时只给题面,也不知道时限)
看到这道题题面,找最长,位置又是有序的,肯定就能想到二分(然而我脑抽,想了几分钟才想到)
然后check里怎么写呢,这是最大的问题
能不能直接判断两者相不相等呢,我们可以使用字符串哈希!!!(这就不要讲了吧)
但是位置一个个枚举吗(时间空间双爆炸!!!)?
我们只能选择更优的办法,要是能把值相等的放在一起,符合的选最大位置就好了。
我想了很久,一开始使用map(被老师坑了),后面突然想到一个好东西,sort!!!(然而又被老师坑了)
sort可以将几个值相等的放一起,但却不知道初始位置,不过这个一下就解决了,可以再用个数组记录嘛
于是就写了下来,然后惊奇地发现,过了!!!
代码如下(有几个坑点):
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
int n,m,wz;
char s[];
unsigned long long p[],sum[];
inline int max(int a,int b){
return a>b?a:b;
}
struct ab{//结构体,a记值,b记位置
unsigned long long a;
int b;
}t[];
inline bool cmp(ab x,ab y){//快排,值相等位置大的放后面
return x.a<y.a||(x.a==y.a&&x.b<y.b);
}
inline bool check(int x){
wz=;
for(int i=;i<=n-x+;i++)
t[i].a=sum[i+x-]-sum[i-]*p[x],t[i].b=i;
sort(t+,t++n-x,cmp);
int j=;//j开始要置1,因为开始就是一个
for(int i=;i<=n-x+;i++){
if(t[i].a==t[i-].a)j++;//相等加1
else j=;
if(j>=m)wz=max(wz,t[i].b);//可以就选大
}
if(wz)return true;
return false;
}
int main(){
p[]=;
for(int i=;i<=;i++)p[i]=p[i-]*;
scanf("%d",&m);
while(m){
int ans1=,ans2=;
scanf("\n%s",s+);
n=strlen(s+);
for(int i=;i<=n;i++)sum[i]=sum[i-]*+s[i];//字符串哈希
int l=,r=n;
int ss=;
while(l<=r){//用l<=r,预防l==r的时候有解却没记录
int mid=(l+r+)/;
if(check(mid))ans1=mid,l=mid+,ss++,ans2=wz-;
else r=mid-;
}
if(!ss)printf("none\n");//没有找到符合的解
else printf("%d %d\n",ans1,ans2);
scanf("%d",&m);
}
return ;
}
题解 UVA12206 【Stammering Aliens】的更多相关文章
- Uva12206 Stammering Aliens 后缀数组&&Hash
Dr. Ellie Arroway has established contact with an extraterrestrial civilization. However, all effort ...
- UVA12206 Stammering Aliens 【SAM 或 二分 + hash】
题意 求一个串中出现至少m次的子串的最大长度,对于最大长度,求出最大的左端点 题解 本来想练哈希的,没忍住就写了一个SAM SAM拿来做就很裸了 只要检查每个节点的right集合大小是否不小于m,然后 ...
- UVA12206 Stammering Aliens
思路 可以二分答案+哈希 判断有没有那个长为L的串出现至少m次即可 代码 #include <cstdio> #include <cstring> #include <a ...
- UVA 12206 - Stammering Aliens(后缀数组)
UVA 12206 - Stammering Aliens 题目链接 题意:给定一个序列,求出出现次数大于m,长度最长的子串的最大下标 思路:后缀数组.搞出height数组后,利用二分去查找就可以 这 ...
- Stammering Aliens
Stammering Aliens Time Limit: 2000MS Memory Limit: 65536K Description Dr. Ellie Arroway has ...
- HDU4080 Stammering Aliens(二分 + 后缀数组)
题目 Source http://acm.hdu.edu.cn/showproblem.php?pid=4080 Description Dr. Ellie Arroway has establish ...
- UVALive - 4513 Stammering Aliens ——(hash+二分 || 后缀数组加二分)
题意:找一个出现了m次的最长子串,以及这时的最右的位置. hash的话代码还是比较好写的,,但是时间比SA多很多.. #include <stdio.h> #include <alg ...
- Hash(LCP) || 后缀数组 LA 4513 Stammering Aliens
题目传送门 题意:训练指南P225 分析:二分寻找长度,用hash值来比较长度为L的字串是否相等. #include <bits/stdc++.h> using namespace std ...
- UVa 12206 (字符串哈希) Stammering Aliens
体验了一把字符串Hash的做法,感觉Hash这种人品算法好神奇. 也许这道题的正解是后缀数组,但Hash做法的优势就是编码复杂度大大降低. #include <cstdio> #inclu ...
随机推荐
- 流媒体应用程序Mobdro或存在安全隐患
Mobdro是一款流媒体应用程序,可以安装在任何Android设备上,包括手机,平板电脑,亚马逊的Fire TV Stick和Google的Chromecast.它现在已经流行了一段时间,特别是在围绕 ...
- laydate 监听日期切换
```` //日期范围 laydate.render({ elem: '#Time', range: "至", max: gitData() ,done: function(val ...
- Matplotlib 绘图与可视化 一些属性和错误
属性 *)调整图像边缘及图像间的空白间隔plt.subplots.adjust(6个参数) 图像外部边缘的调整可以使用plt.tight_layout()进行自动控制,此方法不能够很好的控制图像间的间 ...
- 【codeforces 743E】Vladik and cards
[题目链接]:http://codeforces.com/problemset/problem/743/E [题意] 给你n个数字; 这些数字都是1到8范围内的整数; 然后让你从中选出一个最长的子列; ...
- Nutch的配置(使用MySQL作为数据存储)
首先先从http://www.apache.org/dyn/closer.cgi/nutch/下载安装包 这里假定nutch的根目录为:${APACHE_NUTCH_HOME} 配置${APACHE_ ...
- 怎么用命令行运行jar文件
假设你配置好了jre环境,你如今有一个打包好的jar文件,你能够这样子開始运行 java -classpath example.jar mainClass -classpath告诉虚拟机在哪里找类的字 ...
- 初始化的数值(int、double等)(一)
首先考虑一个具有几个构造函数的MyClass类.如果我们决定在这个类的私有部分加入一个新的数据成员,称为int_data_: class MyClass { public: MyClass() : i ...
- EF的CRUD
已经知道EF就是一个能够使得编程人员用面向对象的思想操作数据库的框架,那么在最初学习SQL的时候我们就知道对数据库的操作就是增删改查.万变不离其宗. EF也是操作数据库的当然也就是要对数据库实现增删改 ...
- Bootstrap全局CSS样式之表单
.form-control--将单独的表单控件赋予一些全局样式,如默认宽度width:100%. .form-group--包裹表单控件,获得最好的排列: .form-inline--将表单设置为内联 ...
- iOS 自己主动登录,登录过程中一直显示载入页
iOS开发中 假设client做的人性化一点肯定会考虑自己主动登录 事实上原理非常easy,就是再首次登录成功之后将username和password存入userdefault 下次登录的时候推断us ...