多項式插值取模雜湊標記法

2022-04-11 17:55:41 字數 2245 閱讀 2429

多項式插值取模雜湊標記法是用來標記字串的一種雜湊標記法,能夠快速,較為精確的進行雜湊標記。

在該方法中,字串被看做是一種37進製的數。

對於乙個字串,可以用以下方法計算它的雜湊值

ll p=0;   //

計算hash值用

for(j=0;j)

p=p*t+(a[j]-'

a'+1);

其中t=37。

我們可以發現,如果乙個串的長度上千上萬,那麼這個hash值就會很大。這時候,我們需要將hash值進行分類,也就是取模,我們設定乙個常數,假設這個常數是h,那麼所有的hash值將會被分類成h類。分別是

0+h,0+2*h......0+n*h

1+h,1+2*h,1+3*h.....1+n*h

n-1+h,n-1+2*h,n-1+3*h.....n-1+n*h

我們用乙個vectorval[h],即h個vector容器來儲存著h類hash值。

假設現在某個字串的hash值是m,那麼我們查詢的時候,就先將m%h,看看它到底屬於哪個分類,然後再對val[m%h]進行遍歷,看看裡面是否有某乙個值等於m,如果有,就說明該字串曾經出現過了,如果沒有的話,就將m插入到val[m%h]中。

看乙個具體的練習:

給定n個字串,n<=100,每個串的長度<=1000。

求有多少個子串,子串長度越長越好,在這n個字串中最少出現了n/2+1次。

例如:3

abcdefg

bcdefgh

cdefghi

那麼答案是

bcdefg

cdefgh

分析:我們可以在1到1000中二分列舉最終答案的長度,然後對給定的n個字串,hash它們所有可能組成的長度為二分長度的子串,用乙個計數方法,記錄每種hash重複出現的次數(同乙個串中重複出現不算)。最後把所有出現次數大於等於n/2+1的子串數出來就可以了。

view code

#include#include

#include

#include

using

namespace

std;

#define maxn 111

#define maxlen 1111

#define mic 334423 //

分類#define ll unsigned __int64

const ll t=37; //

進製struct

node

}; struct

hash

que.clear();

}void insert(char *s,ll p,int lt) //

將hash值為p,串為s,母串下標為lt的hash串插入

return

; }

} //不存在,將該hash值新增到pos類中

val[pos].push_back(p);

index[pos].push_back(que.size());

//記錄該hash串在que中的下標,即que.size()這個位置

que.push_back(node(s,pos,1

,lt));

}intout(int lim,string *s,int

len)

}return

ans;

}}h;int n,l,r,mid; //

二分使用

ll r[maxn]; //

t進製中,向前推進某一位需要的階數,calc函式中要用到

char a[maxn][maxlen]; //

記錄題目給出的字串

string ptr[maxlen]; //

答案記錄在這裡

inline

int calc(int

len)

}return h.out(n/2+1

,ptr,len);

}int

main()

l=1;r=maxlen;

int ans=0

; anslen=1

;

while(l<=r)

else

}ans=calc(anslen); //

最大長度下的個數

if(ans==0

) printf(

"?\n");

else

}return0;

}

多項式取模 模板

最近想寫一下多項式取模的模板,然而找不到模板題。於是上網找了個高精度除法題,寫完之後才發現高精度除法和多項式取模是不一樣的qaq。前者要求不能出現負數,為此某些位置可以暫時為0,將餘數拉到後面 而多項式取模則要求最高項一定要剩餘0。於是我把程式隨便改了改,先扔在這兒,以後備忘。我寫的是實數 fft ...

多項式除法 取模

除法 取模 設 n 次多項式 f x 和 m 次多項式 g x 求 n m 次多項式 q x 和 m 1 次多項式 r x 滿足 f x g x q x r x 於是我們有 f frac g frac q frac r frac 兩遍同乘 x n x nf frac x mg frac x q fr...

插值多項式例子

給定函式 ex 在區間 1,1 上的資料表如下 x 101 f x 0.3679 1.0000 2.7182f x 0.3679 1.0000 2.7182 給出 hermite 插值多項式,並計算其誤差。mathematica code create by zzw clear f,f1,a her...