设为首页 加入收藏

TOP

uva 12206 - Stammering Aliens(哈希)
2015-07-20 17:46:29 来源: 作者: 【 】 浏览:1
Tags:uva 12206 Stammering Aliens 哈希

题目链接:uva 12206 - Stammering Aliens

题目大意:给出一个字符串,找出至少出现m次的最长子串。

解题思路:哈希算法,将每个后缀数组建立一个哈希值,每次二分长度判断,每次判断时将哈希值排序,计数即可。

#include 
   
     #include 
    
      #include 
     
       using namespace std; typedef unsigned long long ll; const int maxn = 40005; const int x = 123; int N, M, pos, Rank[maxn]; char str[maxn]; ll h[maxn], xp[maxn], Hash[maxn]; void init () { scanf("%s", str); N = strlen(str); h[N] = 0; for (int i = N - 1; i >= 0; i--) h[i] = h[i+1] * x + str[i] - 'a'; xp[0] = 1; for (int i = 1; i <= N; i++) xp[i] = xp[i-1] * x; } bool cmp (const int& a, const int& b) { return Hash[a] < Hash[b] || (Hash[a] == Hash[b] && a < b); } bool judge (int l) { int c = 0, n = N - l + 1; pos = -1; for (int i = 0; i < n; i++) { Rank[i] = i; Hash[i] = h[i] - h[i+l] * xp[l]; } sort (Rank, Rank + n, cmp); for (int i = 0; i < n; i++) { if (i == 0 || Hash[Rank[i]] != Hash[Rank[i-1]]) c = 0; if (++c >= M) pos = max(pos, Rank[i]); } return pos >= 0; } void bsearch () { if (!judge(1)) { printf("none\n"); return; } int l = 1, r = N + 1; while (r - l > 1) { int mid = (r + l) / 2; if (judge(mid)) l = mid; else r = mid; } judge(l); printf("%d %d\n", l, pos); } int main () { while (scanf("%d", &M) == 1 && M) { init(); bsearch(); } return 0; }
     
    
   
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇uva 11107 - Life Forms(后缀数组) 下一篇HDU 3726 Graph and Queries trea..

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容:

·C语言中如何将结构体 (2025-12-24 22:20:09)
·纯C语言结构体成员变 (2025-12-24 22:20:06)
·C语言中,指针函数和 (2025-12-24 22:20:03)
·哈希表 - 菜鸟教程 (2025-12-24 20:18:55)
·MySQL存储引擎InnoDB (2025-12-24 20:18:53)