体验了一把字符串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相关推荐

  1. HDU4080【Stammering Aliens】(字符串哈希、二分法)

    •题目地址HDU4080[Stammering Aliens] •题目描述 • Ellie Arroway博士与一个外星文明建立了联系.然而,所有破解外星人讯息的努力都失败了,因为他们遇上了一群口吃的 ...

  2. Stammering Aliens

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

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

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

  4. 【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} ...

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

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

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

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

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

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

  8. HDU - 3613 Best Reward(字符串哈希)

    题目链接:点击查看 题目大意:给出一个字符串,每个字母都有一个贡献值,现在要将这个字符串拆成两个子串,如果子串是回文串的话,贡献就是其中每个字母的贡献和,现在问贡献最大为多少 题目分析:很简单的一道回 ...

  9. 怎么把字符串变成数组_字符串哈希:从零开始的十分钟包会教程

    大家吼啊!这是我下定决心写专栏以来的第二篇文章,请大家多多资瓷!!同样我们先以上次的话起头吧! 恭喜你找到了这篇博客!虽然这个标题看起来非常像是nc营销号的标题但是!请相信我一次这是真的!如果不行请随 ...

最新文章

  1. tomcat启动时一闪而过的问题
  2. ubuntu16.0.4 opencv4.0.0 GPU 版本的 SURF
  3. Java学习第三天160818 表单 框架 下拉列表等
  4. leetcode 160 简单难度 相交链表
  5. C++ Primer 5th笔记(chap 13 拷贝控制)引用计数
  6. linux下软件实施,linux系统未来或应用广泛
  7. 一种嵌入式系统的内存分配方案
  8. 使用Spring Data Neo4j进行领域建模
  9. java错误switch找不到符号,Java使用StringBuilder时--找不到符号
  10. 如何编写一个python项目
  11. 程序员面试金典 - 面试题 17.06. 2出现的次数(找递推规律)
  12. 图论算法——图的遍历
  13. 谈用VB无窗口透明Usercontrol编写透明浮动按钮
  14. 【渝粤教育】国家开放大学2018年春季 7392-22DMatlab语言及其应用 参考试题
  15. 2021-07-01事件绑定
  16. springboot maven项目打包SAPJCO3.JAR
  17. mac/macbook teamviewer 使用 trackpad 触控板双指滑动出问题/出bug/无法控制/无法滚动/速度过快
  18. 手把手教你用Python分析微信聊天内容
  19. 开发小程序的正确方式
  20. 微信小程序使用 setInterval 制作计时器后台延迟问题

热门文章

  1. HashMap使用HashMap(int initialCapacity)初始化
  2. Java程序员面试准备-路线
  3. mysql 11.2.16_Navicat for MySQL 11.2
  4. SSL/TLS深度解析--测试TLS/SSL加密
  5. SSH安全登陆原理:密码登陆与公钥登陆
  6. android ijkplayer c层分析-prepare过程与读取线程(续1-解码粗略分析)
  7. Thinking in ++i and i++
  8. 【JAVASCRIPT】javascript获取屏幕,浏览器,网页高度宽度
  9. Java Number Tips
  10. 为centos5.5添加axel插件