學習筆記 基礎字串演算法

2022-09-22 05:51:09 字數 962 閱讀 9343

這裡使用「基礎」僅代表整合一些篇幅小的演算法與後續幾篇大的字串演算法文章區別。

留給自己補科技樹的時間越來越短了。

字串雜湊

容易實現,可以快速比對兩個串是否相等。

一般可以使用自然溢位\(hash\)。

注意使用非自然溢位時,應當把膜數取比字串數量高乙個數量級的質數。

最小迴圈表示法

考慮有\(sam\)構建的做法。

我們這裡有乙個簡單做法,定義兩個指標\(i = 1,j = 2\)。

兩個指標不斷向後匹配,直到兩個字元不相等,假設前面相等的長度為\(k\),如果\(s[i + k] < s[j + k]\),則\(j = j + k + 1\),否則\(i = i + k + 1\),如果上述操作之後兩個數相等,則強制乙個向後移動。

具體實現則是:

scanf("%lld",&n);

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

scanf("%lld",&a[i]);

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

a[i] = a[i - n];

int j = 1,i = 2,k,tmp;

while(i <= n)

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

std::cout<

kmp 演算法

現在看kmp就覺得有新的理解。

我們現在發現求出的\(next\)實際是最長的border。

ac自動機

考慮實際上是在\(trie\)上構建最長border樹。

有三類題目:

首先是直接在自動機上匹配的問題。

第二類是在\(ac\)自動機上dp,這類問題是強制不能出現或者一定出現的題,可以直接在trie圖上跑,並記錄狀態即可。

第三類題目即使用\(fail\)樹,其關鍵性質是所有有\(s\)作為子串的串都在其子樹內,有意思的題即我前幾天寫的salieri

演算法筆記學習記錄 字串

這是我學習演算法筆記的記錄性質的部落格,記錄我寒假學習演算法筆記的過程。把手放在鍵盤上時,稍不注意就會往右錯一位。這樣的話,q就會變成w,j變成k等。輸入乙個錯位後敲出的字串,輸出打字員原本想打出的句子。樣例輸入 o s,gomr ypfsu 樣例輸出 i am fine today.分析 沒吃輸入...

字串 學習筆記

這篇部落格只是記錄一下我在做題過程中碰到的一些關於字串巧妙的處理方式 可能只對我這個菜雞來說相對巧妙吧 1 stringstream的使用 第一次碰到stringstream的使用是在紫書上面p112,題目是uva10815。前幾天補字串的題目的時候在 洛谷p1308統計單詞數 也碰到了一題可以使用...

字串演算法學習筆記(三)

回文字串是指正序和反序以向的字串 定義前後指標,看你對應的位置是不是一樣 bool judge string a,int size int front 前指標 int end 後指標 front 0 初始指向字串的頭 end size 1 初始指向字串的尾 while front end front...