UVa 12206 (字符串哈希) Stammering Aliens
体验了一把字符串Hash的做法,感觉Hash这种人品算法好神奇。
也许这道题的正解是后缀数组,但Hash做法的优势就是编码复杂度大大降低。
1 #include <cstdio> 2 #include <cstring> 3 #include <algorithm> 4 using namespace std; 5 6 const int maxn = 40000 + 10; 7 const int x = 123; 8 int n, m, pos; 9 unsigned long long H[maxn], xp[maxn]; 10 unsigned long long hash[maxn]; 11 int rank[maxn]; 12 char s[maxn]; 13 14 bool cmp(const int& a, const int& b) 15 { return hash[a] < hash[b] || (hash[a] == hash[b] && a < b); } 16 17 bool possible(int L) 18 { 19 int cnt = 0; 20 pos = -1; 21 for(int i = 0; i + L - 1 < n; i++) 22 { 23 rank[i] = i; 24 hash[i] = H[i] - H[i + L] * xp[L]; 25 } 26 sort(rank, rank + n - L + 1, cmp); 27 for(int i = 0; i + L - 1 < n; i++) 28 { 29 if(i == 0 || hash[rank[i]] != hash[rank[i - 1]]) cnt = 0; 30 if(++cnt >= m) pos = max(pos, rank[i]); 31 } 32 return pos >= 0; 33 } 34 35 int main() 36 { 37 //freopen("in.txt", "r", stdin); 38 39 xp[0] = 1; 40 for(int i = 1; i < maxn; i++) xp[i] = xp[i - 1] * x; 41 42 while(scanf("%d", &m) == 1 && m) 43 { 44 scanf("%s", s); 45 n = strlen(s); 46 H[n] = 0; 47 for(int i = n - 1; i >= 0; i--) H[i] = H[i + 1] * x + s[i] - 'a'; 48 49 if(!possible(1)) puts("none"); 50 else 51 { 52 int L = 1, R = n; 53 while(L < R) 54 { 55 int M = (L + R + 1) / 2; 56 if(possible(M)) L = M; 57 else R = M - 1; 58 } 59 possible(L); 60 printf("%d %d\n", L, pos); 61 } 62 } 63 64 return 0; 65 }
代码君
转载于:https://www.cnblogs.com/AOQNRMGYXLMV/p/4447047.html
UVa 12206 (字符串哈希) Stammering Aliens相关推荐
- HDU4080【Stammering Aliens】(字符串哈希、二分法)
•题目地址HDU4080[Stammering Aliens] •题目描述 • Ellie Arroway博士与一个外星文明建立了联系.然而,所有破解外星人讯息的努力都失败了,因为他们遇上了一群口吃的 ...
- Stammering Aliens
2.Stammering Aliens (aliens.cpp) 有一个口吃的外星人,说的话里包含很多重复的字符串,比如babab包含两个bab.给定这个外星人说的一句话,找出至少出现m次的最长字符串 ...
- ELFhash - 优秀的字符串哈希算法
原 ELFhash - 优秀的字符串哈希算法 分类:算法杂论算法精讲数据结构 (1424) (2) 1.字符串哈希: 我们先从字符串哈希说起 在很多的情况下,我们有可能会获得大量的字符串,每个字符串 ...
- 【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} ...
- 138. 兔子与兔子【字符串哈希】
很基础的字符串哈希 #include<bits/stdc++.h> using namespace std; typedef unsigned long long int ull; con ...
- Singing Superstar 字符串哈希-map操作
题意 : 给一长度 < 1e5 的字符串s,q < 1e5次询问,每次问一个长 < 30 的串 t 在s中出现的次数,且t不可重叠. 例 : "abababa"中 ...
- 中石油训练赛 - DNA(字符串哈希)
题目链接:点击查看 题目大意:给出一串只由A,C,G,T组成的字符串,再给出一个数字k,问每个长度为k的连续子串,出现的次数最多是多少次 题目分析:O(n)哈希一下,O(n)更新一下用无序map维护的 ...
- HDU - 3613 Best Reward(字符串哈希)
题目链接:点击查看 题目大意:给出一个字符串,每个字母都有一个贡献值,现在要将这个字符串拆成两个子串,如果子串是回文串的话,贡献就是其中每个字母的贡献和,现在问贡献最大为多少 题目分析:很简单的一道回 ...
- 怎么把字符串变成数组_字符串哈希:从零开始的十分钟包会教程
大家吼啊!这是我下定决心写专栏以来的第二篇文章,请大家多多资瓷!!同样我们先以上次的话起头吧! 恭喜你找到了这篇博客!虽然这个标题看起来非常像是nc营销号的标题但是!请相信我一次这是真的!如果不行请随 ...
最新文章
- tomcat启动时一闪而过的问题
- ubuntu16.0.4 opencv4.0.0 GPU 版本的 SURF
- Java学习第三天160818 表单 框架 下拉列表等
- leetcode 160 简单难度 相交链表
- C++ Primer 5th笔记(chap 13 拷贝控制)引用计数
- linux下软件实施,linux系统未来或应用广泛
- 一种嵌入式系统的内存分配方案
- 使用Spring Data Neo4j进行领域建模
- java错误switch找不到符号,Java使用StringBuilder时--找不到符号
- 如何编写一个python项目
- 程序员面试金典 - 面试题 17.06. 2出现的次数(找递推规律)
- 图论算法——图的遍历
- 谈用VB无窗口透明Usercontrol编写透明浮动按钮
- 【渝粤教育】国家开放大学2018年春季 7392-22DMatlab语言及其应用 参考试题
- 2021-07-01事件绑定
- springboot maven项目打包SAPJCO3.JAR
- mac/macbook teamviewer 使用 trackpad 触控板双指滑动出问题/出bug/无法控制/无法滚动/速度过快
- 手把手教你用Python分析微信聊天内容
- 开发小程序的正确方式
- 微信小程序使用 setInterval 制作计时器后台延迟问题
热门文章
- HashMap使用HashMap(int initialCapacity)初始化
- Java程序员面试准备-路线
- mysql 11.2.16_Navicat for MySQL 11.2
- SSL/TLS深度解析--测试TLS/SSL加密
- SSH安全登陆原理:密码登陆与公钥登陆
- android ijkplayer c层分析-prepare过程与读取线程(续1-解码粗略分析)
- Thinking in ++i and i++
- 【JAVASCRIPT】javascript获取屏幕,浏览器,网页高度宽度
- Java Number Tips
- 为centos5.5添加axel插件