1. 程式人生 > >4080 Stammering Aliens(字串hash + 二分)

4080 Stammering Aliens(字串hash + 二分)

題目大意:

給出一個m和一個字串s,尋找s的最長子串滿足:該子串在s中出現不小於m次。如果有多個子串滿足,選擇最右側開始的子串。要求輸出子串的出現次數和最右側一個子串的出現位置。

思路:

容易想到用BKDR雜湊函式和二分子串長度來做。
WA了兩次,第一次solved函式裡ans的初始值設定錯了,不應該設定為0,改成-1;第二次二分結果後不應該直接輸出t,因為t有-1情況,轉成了ans。

程式碼:

#include<bits/stdc++.h>

using namespace std;
const int maxn = 40000 + 5;
const int seed = 31
; typedef unsigned long long ull; ull _base[maxn], _hash[maxn]; int len; map<ull, ull> mp; int m; string s; ull str_hash(int l, int r) { return _hash[l] - _hash[r+1] * _base[r-l+1]; } int solved(int l) { mp.clear(); int ans = -1; for(int i = 0; i <= len - l; i++) { ull t = str_hash(i, i+l-1
); mp[t]++; if(mp[t] >= m) ans = i; } return ans; } int main() { _base[0] = 1; for(int i = 1; i < maxn; i++) _base[i] = _base[i-1] * seed; while(cin >> m, m) { cin >> s; len = s.length(); _hash[len] = 0; for(int i = len-1
; i >= 0; i--) _hash[i] = _hash[i+1] * seed + (s[i] - 'a' + 1); int l = 1, r = len - m + 1, t, ans; if(solved(l) == -1) {cout << "none" << endl; continue;} while(l <= r) { int mid = (l+r) >> 1; t = solved(mid); if(t != -1) { l = mid + 1; ans = t; } else r = mid - 1; } cout << r << ' ' << ans << endl; } return 0; }

相關推薦

4080 Stammering Aliens(字串hash + 二分)

題目大意: 給出一個m和一個字串s,尋找s的最長子串滿足:該子串在s中出現不小於m次。如果有多個子串滿足,選擇最右側開始的子串。要求輸出子串的出現次數和最右側一個子串的出現位置。 思路:

Stammering Aliens(字尾陣列+二分)

Dr. Ellie Arroway has established contact with an extraterrestrial civilization. However, all efforts to decode their messages have failed so far beca

字串hash + 二分答案

// Memory Time // 1347k 0MS // by : Snarl_jsb // 2014-10-04-21.16 #include<algorithm> #include<cstdio> #include<cstring> #include&

UVALive - 4513 Stammering Aliens [ Hash + 二分 ]

Problem Description Dr. Ellie Arroway has established contact with an extraterrestrial civilization. However, all efforts to decode their mes

[luoguP2601] [ZJOI2009]對稱的正方形(二維Hash + 二分 || Manacher)

getchar() cst ons pro color tar zjoi fine long 傳送門 很蒙蔽,不知道怎麽搞。 網上看題解有說可以哈希+二分搞,也有的人說用Manacher搞,Manacher是什麽鬼?以後再學。 對於這個題,可以從矩陣4個角

BNU 34990 Justice String (hash+二分求LCP)

urn ont 最長公共前綴 inf memset return mem 第一個字符 bnu 思路:枚舉第一個字符串的位置,然後枚舉最長公共前綴的長度,時間即會下降…… #pragma comment(linker, "/STACK:1024000000

BZOJ 1014 [JSOI2008]火星人prefix (Splay + Hash + 二分)

uil 現在 scrip 滿足 gcd scan 地球 back define 1014: [JSOI2008]火星人prefix Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 8112 Solved: 2569[Sub

Uva 12206 Stammering Aliens

region load png highlight return string mat reg tdi 題目描述 輸入輸出格式 輸入格式: 輸出格式: 輸入輸出樣例 輸入樣例#1: 3 baaaababababbababbab 11 baaaab

[TJOI2017] DNA 解題報告 (hash+二分

log h+ get www. signed targe 相差 ria type 題目鏈接:https://www.luogu.org/problemnew/show/P3763 題目大意: 給定原串S0,詢問S0有多少個子串和給定串S相差不到3個字母 題解: 我們

ural1989 單點更新+字串hash

正解是雙雜湊,不過一次雜湊也能解決。。 然後某個數字就對應一個字串,雖然有些不同串對應同一個數字,但是概率非常小,可以忽略不計。從左到右、從右到左進行兩次hash,如果是迴文串,那麼對應的整數必定存在某種關係(可以理解成相等),對於更新操作,就是單點更新。 #include<iostream&

Hash_字串hash_二分_倍增_CH1809

點此開啟題目頁面 思路分析: 字串hash配合二分或倍增均可, 下面先給出配合二分的AC程式碼, 然後給出配合倍增的AC程式碼: //CH1809_匹配統計 #include <iostream> #include <cstdio> using namespace

Power Strings---字串hash

問題 C: 【雜湊和雜湊表】Power Strings 時間限制: 1 Sec  記憶體限制: 128 MB 提交: 38  解決: 18 [提交] [狀態] [討論版] [命題人:外部匯入] 題目描述 Gi

luogu4407 [JSOI2009]電子字典 字串hash + hash

暴力列舉,然後\(hash\)表判斷 複雜度\(O(26 * 20 * n)\) 具體而言 對於操作1:暴力列舉刪除 對於操作2:暴力新增,注意新增不要重複 對於操作3:暴力替換,同樣的注意不要重複 #include <cstdio> #include <cstr

洛谷P1032 字串變換 【kmp,字串hash

大意 給定轉換規則,求最小步數 思路 其實可以用AC自動機 這道題是問我們最小步數,因為其分支不大(≤7\leq7≤7)容易想到專門處理最優化問題的bfsbfsbfs演算法 在bfsbfsbfs的匹配中,本人採用的是用字元陣列模擬字串中的運算,建立新的“Str

6976 hash+二分查詢

In Marjar University, students in College of Computer Science will learn EON (Edward Object Notation), which is a hierarchical data format

985F Isomorphic Strings(字串Hash雜湊)

F. Isomorphic Strings time limit per test 3 seconds memory limit per test 256 megabytes input standard input output standard outpu

【資料結構】【線段樹】【字串Hash】2018國慶三校聯考D4T3

題意: 分析: 題解見標籤 (不過這題有非正解方法可以卡過去。。我程式碼附在下面) 正解: #include<cstdio> #include<cstring> #inclu

nssl1211-好文章【字串hash,map】

正題 題目大意 求長度為n個一個字串長度為m不同的子串個數 解題思路 用字串hash判斷字串是否相同,然後時間複雜度O(n2)O(n^2)O(n2),然後我們因為自然溢位所以不能開桶,那就開map。

URAL - 1989 Subpalindromes (字串hash + 線段樹區間合併)

題目連結:http://acm.timus.ru/problem.aspx?space=1&num=1989 題目大意:給出一個長度為n的字串S,接下來進行n次操作。操作分為修改和查詢兩種,每次修改操作給出一個整數 i 和一個字元c,表示將第 i 位的字元變成字元c;每次查詢操作給出兩個

字串hash(scu4438)

Censor frog is now a editor to censor so-called sensitive words (敏感詞). She has a long text pp. Her job is relatively simple -- just to f