多項式插值取模雜湊標記法是用來標記字串的一種雜湊標記法,能夠快速,較為精確的進行雜湊標記。
在該方法中,字串被看做是一種37進製的數。
對於乙個字串,可以用以下方法計算它的雜湊值
ll p=0; //其中t=37。計算hash值用
for(j=0;j)
p=p*t+(a[j]-'
a'+1);
我們可以發現,如果乙個串的長度上千上萬,那麼這個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...