POJ 3461字串匹配演算法

2021-09-11 17:58:31 字數 1134 閱讀 6063

t組資料,每組資料輸入兩個字串s,c;求s在c**現多少次,輸出次數。

這道題是個字串匹配題,可以用kmp演算法來做,也可用字串hash。這兩個演算法的時間複雜度都是線性的。下邊分別介紹兩種演算法。

字串hash

在c語言裡每個字元都可以看成乙個數字,範圍是0-127,比如『a』=97;  所以乙個字串可以看成乙個128進製的數字,即這個字串的hash值。

比如字串abc可以看成128進製的數字 97 98 99 ,等於97*128^2+98^1+99。

字串hash函式把乙個任意長度的字串對映成乙個非負整數,其衝突概率幾乎為0.

可以在o(strlen(s))的時間內算出字串s的hash值。

可以在o(strlen(c))的時間內算出c[1到i](1<=i<=strlen(c))的hash值,儲存在陣列裡。

然後遍歷一遍hash值,算長度為strlen(s)的子串有多少hash值與s的hash值相同

**

#include#include #include#include using namespace std;

typedef unsigned long long ull;

const int maxn=1e6+10;

char c[maxn],s[maxn];

ull ha[maxn];

int main()

ha[0]=0;

for(int i=1;i<=n;i++)

int ans=0;

for(int i=m;i<=n;i++)

}cout<kmp

#include#include #include#include using namespace std;

typedef long long ll;

const int maxn=1e6+10;

char c[maxn],s[maxn];

int n,m;

int nxt[maxn];

void f()else

if(j==m)

}cout<}

return 0;

}

POJ 3461題解(kmp演算法)文字串和子串匹配

poj3461傳送門 特殊的樣例 azaazazaza 輸出 所以next陣列要多一位,0 1 1 2 當模式串比較完之後要指向的是next陣列的最後一位,即開始從第二位字母比較,模擬過程如下 azazaza azazaza aza aza 所以這道題和最基礎的文字串和模式串比較不太一樣,是文字串和...

POJ 3080 字串匹配

題意 給出n個字串,找出其最長公共子串,若子串長度 3,則輸出最長公共子串,否則輸出.本來以為要用到kmp或者字尾陣列什麼的,思考了很久沒有思路,看了一下discuss,發現可以暴力過,而且0ms,也是醉了.include include include include include includ...

33 字串匹配演算法

題目 給乙個很長字串,要求找到符合要求的字串,例如目的串123,1 3 2,12 3這些都要找出來 解 這題的意思是,例如給定目的串s abc 那麼在這個很長的字串中尋找子字串,這個子字串中滿足s中的每個字元都要出現,並且s中的某乙個字元只出現1次。設待匹配字串長度位n,模式字串長度位m 1。對待匹...