题目地址HDU4080【Stammering Aliens】
题目描述
• Ellie Arroway博士与一个外星文明建立了联系。然而,所有破解外星人讯息的努力都失败了,因为他们遇上了一群口吃的外星人。Ellie的团队发现,在每一条足够长的讯息中,最重要的单词都会以连续字符的顺序出现一定次数的重复,甚至出现在其他单词的中间;而且,有时讯息会以一种模糊的方式缩写;例如,如果外星人要说bab两次,他们可能会发送讯息babab,该讯息已被缩写,在第一个单词中第二个b被重用为第二个单词中的第一个b。
• 因此,一条讯息可能包含重复的相同单词一遍又一遍。现在,Ellie向您,S.R. Hadden,寻求帮助,以确定一条讯息的要点。
• 给出一个整数m和一个表示讯息的字符串s,请您查找至少出现m次的s的最长子字符串。例如,在讯息baaaababababbababbab中,长度为5个单词的babab包含3次,即在位置5、7和12处(其中下标索引从零开始),出现3次或更多次的子字符串不会比5更长(请参见样例输入中的第1个样例);而且,在这条讯息中,有子串出现11次或更多次(请参见第2个样例)。如果存在多个
解决方案,则首选出现最右的子字符串(请参见第3个样例)。
输入
• 输入包含若干测试用例。每个测试用例在第一行给出一个整数m (m>=1),表示最小重复次数;下来的一行给出一个长度介于m和40000之间(包括m和40000)的字符串s。在s中,所有字符都是从“a”到“z”的小写字符。最后一个测试用例由m=0标识,程序不用处理。
输出
• 对每个测试用例输出一行。如果无解,则输出none;否则,在一行中输出两个用空格分隔的整数,第一个整数表示至少出现m次的子串的最大长度;第二个整数表示此子字符串的最右起始位置。
输入样例

3
baaaababababbababbab
11
baaaababababbababbab
3
cccccc
0

输出样例

5 12
none
4 2

思路:
寻找字符串中出现次数>=m次的子串
字符串hash。
二分子串的长度,然后处理出来所有这个长度的子串的值,排序后找有没有相同的大于等于m个即可。

字符串哈希 详解

代码:

#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
typedef unsigned long long ULL;
const int N = 40010,base = 131;
char str[N];
ULL p[N],h[N];
int len,pos,m;
struct node{ULL x;int px;
}tmp[N];
bool cmp(node a,node b)
{if(a.x == b.x) return a.px < b.px;return a.x < b.x;
}
ULL gethash(int l,int r)
{return h[r] - h[l - 1] * p[r - l + 1];
}
bool isok(int n)
{pos = -1;int k = 0;for(int i = len - n + 1;i >= 1;i--){tmp[k].x = gethash(i,i+n-1);//处理出所有长度为n的子串的值tmp[k++].px = i;}sort(tmp,tmp+k,cmp);int cnt = 1;if(m == 1) pos = 1;for(int i = 1;i < k;i++){if(tmp[i].x == tmp[i-1].x){cnt++;if(cnt >= m)pos = max(pos,tmp[i].px);}       else cnt = 1;      }return pos != -1;
}
void makehash()
{h[0] = 0;p[0] = 1;for(int i = 1;i <= len;i ++ ){h[i] = h[i - 1] * base + str[i] - 'a' + 1;p[i] = p[i - 1] * base;}
}int main()
{while(scanf("%d",&m)&&m){scanf("%s",str + 1);len = strlen(str + 1);makehash();int l=1,r=len,ans=-1,ansp;pos=-1;while(l <= r){int mid = (l+r)/2;if(isok(mid)){ans = mid;ansp = pos;l = mid + 1;}elser = mid-1;}if(ans == -1)printf("none\n");elseprintf("%d %d\n",ans,ansp-1);}return 0;
}

HDU4080【Stammering Aliens】(字符串哈希、二分法)相关推荐

  1. hdu-4080 Stammering Aliens 字符串hash 模板题

    http://acm.hdu.edu.cn/showproblem.php?pid=4080 求出现次数大于等于n的最长串. #include<iostream> #include< ...

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

    题目 Source http://acm.hdu.edu.cn/showproblem.php?pid=4080 Description Dr. Ellie Arroway has establish ...

  3. Stammering Aliens

    2.Stammering Aliens (aliens.cpp) 有一个口吃的外星人,说的话里包含很多重复的字符串,比如babab包含两个bab.给定这个外星人说的一句话,找出至少出现m次的最长字符串 ...

  4. 字符串处理之---字符串哈希

    前言 字符串哈希,非常非常好用NB的方法,虽然有一定概率会翻车(翻车概率极低),但是这个是真的NB,你如果会这个在大多数场合可以避免掉有一些算法的学习,比如马拉车算法, 你学马拉车只能处理回文字符串, ...

  5. ELFhash - 优秀的字符串哈希算法

    原 ELFhash - 优秀的字符串哈希算法 分类:算法杂论算法精讲数据结构 (1424)  (2) 1.字符串哈希: 我们先从字符串哈希说起 在很多的情况下,我们有可能会获得大量的字符串,每个字符串 ...

  6. 【CodeForces】961 F. k-substrings 字符串哈希+二分

    [题目]F. k-substrings [题意]给定长度为n的串S,对于S的每个k-子串$s_ks_{k+1}...s_{n-k+1},k\in[1,\left \lceil \frac{n}{2} ...

  7. 138. 兔子与兔子【字符串哈希】

    很基础的字符串哈希 #include<bits/stdc++.h> using namespace std; typedef unsigned long long int ull; con ...

  8. Singing Superstar 字符串哈希-map操作

    题意 : 给一长度 < 1e5 的字符串s,q < 1e5次询问,每次问一个长 < 30 的串 t 在s中出现的次数,且t不可重叠. 例 : "abababa"中 ...

  9. 中石油训练赛 - DNA(字符串哈希)

    题目链接:点击查看 题目大意:给出一串只由A,C,G,T组成的字符串,再给出一个数字k,问每个长度为k的连续子串,出现的次数最多是多少次 题目分析:O(n)哈希一下,O(n)更新一下用无序map维护的 ...

最新文章

  1. Cisco ACL 一例
  2. mysql 开启不严谨模式,mysql – 为什么innodb严格模式无法启用?
  3. python编程语法-Python编程入门——基础语法详解(经典)
  4. 【转载】如何组建一支优秀的数据分析团队?
  5. 插件~Nuget中包与包的依赖关系
  6. 线性回归—梯度下降python实现
  7. mysql 当前时间的一周后_mysql查询当前时间,一天内,一周,一个月内的sql语句...
  8. 采用静态编译方式防止易语言小程序被误杀
  9. 学习双拼必看(最全教程):双拼输入法的心得以及快速入门办法
  10. 算法 思维导图(一)
  11. js 翻转数组 倒序排列
  12. python爬虫时爬取的html代码显示“请开启JavaScript并刷新该页”
  13. win10清理_win10不再需要杀毒软件,同时建议不要安装垃圾清理类软件
  14. SAP中销售处理到期发票清单VF04功能的应用
  15. 【笔记:模拟CMOS集成电路】两级运算放大器设计与仿真(带版图)
  16. 华为无线设备配置动态负载均衡
  17. Mac安装单机版K8S
  18. 10.SVN入门笔记——使用 SVN 独立客户端TortoiseSVN
  19. Python正规兼职渠道有哪些?副业月入8000+
  20. HTML中华传统文化题材网页《中国民间年画》HTML+CSS+JavaScript

热门文章

  1. LPDDR4x 的 学习总结(2) - SDRAM array结构浅识
  2. 埙曲推荐,《葬花吟》简谱
  3. 预制资源(Prefab)
  4. 服务器占用cpu启动就死机,CPU使用率高会不会造成死机?为何?
  5. D语言与C++做映射时需要注意的事情
  6. Excel比较两个工作表(Sheet)的两组列数据,并返回相应数据
  7. 奥斯汀页眉怎么设置_word奥斯汀样式页眉怎么下拉
  8. 子曾经曰过,先把历史遗留问题解决,然后再展鸿鹄
  9. 单机率公式计算机车日产量,货运机车平均日产量
  10. mysql判断日期是不是月末_java 判断一个日期是不是月末