题解 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# 鼠标左右手切换
using System; using System.Collections.Generic; using System.Text; using System.Runtime.InteropServi ...
- ARM - Linux嵌入式C/C++各种资料分享【更新日期:2012/04/24】
http://blog.csdn.net/shuxiao9058/article/details/6786868 由于115网盘取消大众分享功能,因此不能继续分享下载链接.更新资料将在本人分享空间转存 ...
- myeclipse反编译安装 jd-gui.exe下载
一:在线安装 1.Help->Install New Site Name:** Location:http://jd.benow.ca/jd-eclipse/update 二:手动安装 1.下载 ...
- maven 测试写入JRE参数
项目在测试时碰到一个问题,就是JVM加载参数的问题. web项目本身在注入配置信息的时候,读取的是本地的配置文件,但是配置文件的位置是卸载tomcat 里面配置的JAVA_OPTS里面的. 问题出现了 ...
- 【BZOJ 1433】[ZJOI2009]假期的宿舍
[链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 把每个人都分为左边和右边两个人 xi,yi 如果第i个人不回家或者是外校学生 那么它可以和他认识的人连一条容量为1的边(前提是这个认 ...
- 【万里征程——Windows App开发】控件大集合2
以下再来看看一些前面还没有讲过的控件,只是控件太多以至于无法所有列出来,大家仅仅好举一反三啦. Button 前面最经常使用的控件就是Button啦,Button另一个有意思的属性呢.当把鼠标指针放在 ...
- PHP中用下标符号[]去读取字符串的逻辑
PHP中 [(下标)] 符号不仅能够应用于数组和对象,还能够应用于字符串,假设不注意非常easy出错. 比方获取一个网络接口,正常情况下会返回一个数组结构的json,经过解析之后结果为: array( ...
- [JZOJ 5893] [NOIP2018模拟10.4] 括号序列 解题报告 (Hash+栈+map)
题目链接: https://jzoj.net/senior/#main/show/5893 题目: 题解: 考虑暴力怎么做,我们枚举左端点,维护一个栈,依次加入元素,与栈顶元素和栈内第二个元素相同时弹 ...
- POJ 2188线段树求逆序对
题目给的输入是大坑,算法倒是很简单-- 输入的是绳子的编号wire ID,而不是上(或下)挂钩对应下(或上)挂钩的编号. 所以要转换编号,转换成挂钩的顺序,然后再求逆序数. 知道了这个以后直接乱搞就可 ...
- kettle工具的设计模块
大家都知道,每个ETL工具都用不同的名字来区分不同的组成部分.kettle也不例外. 比如,在 Kettle的四大不同环境工具 本博客,是立足于kettle工具的设计模块的概念介绍. 1.转换 转换( ...