题解 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 ...
随机推荐
- C语言基本语法——指针
1.什么是指针 2.指针用于参数 3.指针用于返回值 4.指针加减操作 5.指针与数组区别 1.什么是指针 • 内存被分为字节,每个字节有唯一的地址,指针指的就是内存地址. • 保存指针的变量,就叫指 ...
- [51nod1074]约瑟夫环V2
N个人坐成一个圆环(编号为1 - N),从第1个人开始报数,数到K的人出列,后面的人重新从1开始报数.问最后剩下的人的编号. 例如:N = 3,K = 2.2号先出列,然后是1号,最后剩下的是3号. ...
- 最全mysql的复制和读写分离
mysql的复制和mysql的读写分离从来就不是一个简单的话题,今天笔者就详细来记录一下我学习的mysql. mysql日至类型有:二进制日志,事务日志,错误日志,一般查询日志,中继日志,慢查询日 ...
- NodeJS踩坑实录
nodejs的常用api url 主要是配置一系列和路径相关的信息 url.parse(urlString[, parseQueryString[, slashesDenoteHost]]) 将一个U ...
- 马上着手开发 iOS 应用程序
https://developer.apple.com/library/ios/referencelibrary/GettingStarted/RoadMapiOSCh/chapters/Introd ...
- C# 发布APP修改APP图标以及名称
很多时候,我们用C#编程后,都要对我们的上位机生成的图标跟名字进行修改,下面我就 VS2015 怎么修改做个说明. 1.打开项目属性 2.打开应用程序的属性界面,对相应的地方进行修改就可以了 3.修改 ...
- iBase4J部署总结
iBase4J部署总结 序言 最近看到个分布式框架,只有一个字:好.所以部署起来看看.开始的时候说实话遇到了点困难.去码云上看了下,貌似想得到指导要加入一个群,而且需要收费的,反正闲来无事,索性自己搞 ...
- [ReactVR] Render Custom 3D Objects Using the Model Component in React VR
React VR isn't limited to simple 3D primitives. By using the <Model/> Component we can place a ...
- UVALive - 2031 Dance Dance Revolution 三维dp
题目大意:有一个胖子在玩跳舞机.刚開始的位置在(0,0).跳舞机有四个方向键,上左下右分别相应1,2,3,4.如今有下面规则 1.假设从0位置移动到随意四个位置,消耗能量2 2.假设从非0位置跳到相邻 ...
- HH实习(hpu1287)(斐波那契运用)
HH实习 Time Limit: 1 Sec Memory Limit: 128 MB Submit: 44 Solved: 29 [Submit][id=1287">Status ...