可修改的雜湊

2021-08-16 00:22:28 字數 1153 閱讀 8966

如果在乙個字串中要找是否存在長度為n的回文串

可以manachar

但是更好打的方式是直接hash

可是,這個hash需要算o(len)個長度為n的字串的hash值

如果暴力,已經到了o(n^2)的級別

那麼考慮一下,

如何簡化。

計算hash的o(n)是不能省的

那麼不難想到利用前面串的結果來巧算後面串的hash值。

可是,hash之所以出名還因為他的不可逆性!

考慮一下這個hash函式 hash( s ) = sigma( s[i]  *   (  x ^ i  )  )  % mod

那麼如果知道s的hash值,刪掉s的第乙個字母後的hash值是可以算的

同理,也可以刪掉最後,在前後加。

這樣我們可以從hash(s[ i  ,   j ])求出 hash(  s[i+1 , j+1] ),而且只要o(1)

這樣就完美的o(n)解決問題。

注意,這並不是指hash是可逆的,最多叫他可修改。

附codeforces 196d accode:

#include#include#include#include#define maxn 800005

#define s 37

#define ll long long

using namespace std;

int m,len,n;

char s[maxn];

ll mod=998244353,pow[maxn],inv;

bool flag;

int tim;

void dfs(int now,ll hash,ll phash,ll hash2,ll phash2,bool changed)

ll tmp1=hash,tmp2=phash,t***=hash2,tmp4=phash2;

if(changed) s[now]='a';

for(;s[now]<='z';s[now]++,changed=1)

}ll pow(ll base,ll k)

int main()

dfs(0,0ll,0ll,0ll,0ll,0);

if(!flag) puts("impossible");

}

線性探測可再雜湊的雜湊

資料結構與演算法分析 c語言描述 第五章 分離鏈結雜湊表 從書上的 小改一下。插入的時候自動選擇是否再雜湊,所以insert要返回乙個hashtable。還有增加是否查抄成功。雖然可以通過返回 1來返回查詢失敗 hashquad.h typedef char elementtype ifndef h...

可雜湊(hashable)物件

乙個可雜湊的物件必須滿足以下要求。1 支援 hash 函式,並且通過 hash 方法所得到的雜湊值是不變的。2 支援通過 eq 方法來檢測相等性。3 若 a b 為真,則 hash a hash b 也為真。注意 所有由使用者自定義的物件預設都是可雜湊的,因為它們的雜湊值由id 來獲取,而且它們都是...

Pyhon中的可雜湊的值和不可雜湊的值

python中可雜湊的值 hashable 和不可雜湊的值 unhashable 可雜湊的值 hashable 可雜湊的資料型別,即 不變的資料結構 數字 字母 字串str 元祖tuple 物件objects 不可雜湊的值 unhashable 不可雜湊的資料型別,即 可變的資料結構 列表list ...