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