题解 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 ...
随机推荐
- 03 Winform基础
补充: MD5加密 static void Main(string[] args) { string s = GetMD5("123"); Console.WriteLine(s) ...
- 清空chrome浏览器缓存
缓存是一个很深奥的东西,虽然查了半天,还是没有搞清楚,希望以后可以遇到前端大神,可以给一个傻瓜化的通俗易懂的解释 已经上线的,后续有迭代的软件,迭代的版本不应该手动清除缓存了,因为太麻烦,对客户来说不 ...
- php && 运算符使用说明
“&&” 运算符的用法: ;;echo $test;//输出:000
- Vue -- 只弹一次的弹框
核心代码是 getCookie()部分,控制弹框的显示隐藏则在 created()中. <template> <div v-if="isShow"> < ...
- 打包成ipa包
http://zengwu3915.blog.163.com/blog/static/27834897201362831449893/?suggestedreading&wumii Xcode ...
- 决策树(Decision Trees)
简介 决策树是一个预测模型,通过坐标数据进行多次分割,找出分界线,绘制决策树. 在机器学习中,决策树学习算法就是根据数据,使用计算机算法自动找出决策边界. 每一次分割代表一次决策,多次决策而形成决策树 ...
- Jquery-ajax错误分析
当我把cshtml中的js代码移出到js文件中,将js代码作为文件引入cshtml时,出现了下面的这样的错误 网上的不少人说是通过在\(.ajax参数中加上async:true解决的,但\).ajax ...
- 洛谷—— P1260 工程规划
https://www.luogu.org/problem/show?pid=1260 题目描述 造一幢大楼是一项艰巨的工程,它是由n个子任务构成的,给它们分别编号1,2,…,n(5≤n≤1000). ...
- soapUI 5.1.2 下载以及破解
转:https://blog.csdn.net/weiqing723/article/details/78865734
- [TS] Class Properties Public, Private and Read Only Modifiers
In the constructor, we want to set the prop to readonly, you need to do like this: class Superhero { ...